staticint cptvf_send_msg_to_pf_timeout(struct cpt_vf *cptvf, struct cpt_mbox *mbx)
{ int timeout = CPT_MBOX_MSG_TIMEOUT; int sleep = 10;
cptvf->pf_acked = false;
cptvf->pf_nacked = false;
cptvf_send_msg_to_pf(cptvf, mbx); /* Wait for previous message to be acked, timeout 2sec */ while (!cptvf->pf_acked) { if (cptvf->pf_nacked) return -EINVAL;
msleep(sleep); if (cptvf->pf_acked) break;
timeout -= sleep; if (!timeout) {
dev_err(&cptvf->pdev->dev, "PF didn't ack to mbox msg %llx from VF%u\n",
(mbx->msg & 0xFF), cptvf->vfid); return -EBUSY;
}
}
return 0;
}
/* * Checks if VF is able to comminicate with PF * and also gets the CPT number this VF is associated to.
*/ int cptvf_check_pf_ready(struct cpt_vf *cptvf)
{ struct pci_dev *pdev = cptvf->pdev; struct cpt_mbox mbx = {};
mbx.msg = CPT_MSG_READY; if (cptvf_send_msg_to_pf_timeout(cptvf, &mbx)) {
dev_err(&pdev->dev, "PF didn't respond to READY msg\n"); return -EBUSY;
}
return 0;
}
/* * Communicate VQs size to PF to program CPT(0)_PF_Q(0-15)_CTL of the VF. * Must be ACKed.
*/ int cptvf_send_vq_size_msg(struct cpt_vf *cptvf)
{ struct pci_dev *pdev = cptvf->pdev; struct cpt_mbox mbx = {};
mbx.msg = CPT_MSG_QLEN;
mbx.data = cptvf->qsize; if (cptvf_send_msg_to_pf_timeout(cptvf, &mbx)) {
dev_err(&pdev->dev, "PF didn't respond to vq_size msg\n"); return -EBUSY;
}
return 0;
}
/* * Communicate VF group required to PF and get the VQ binded to that group
*/ int cptvf_send_vf_to_grp_msg(struct cpt_vf *cptvf)
{ struct pci_dev *pdev = cptvf->pdev; struct cpt_mbox mbx = {};
mbx.msg = CPT_MSG_QBIND_GRP; /* Convey group of the VF */
mbx.data = cptvf->vfgrp; if (cptvf_send_msg_to_pf_timeout(cptvf, &mbx)) {
dev_err(&pdev->dev, "PF didn't respond to vf_type msg\n"); return -EBUSY;
}
return 0;
}
/* * Communicate VF group required to PF and get the VQ binded to that group
*/ int cptvf_send_vf_priority_msg(struct cpt_vf *cptvf)
{ struct pci_dev *pdev = cptvf->pdev; struct cpt_mbox mbx = {};
mbx.msg = CPT_MSG_VQ_PRIORITY; /* Convey group of the VF */
mbx.data = cptvf->priority; if (cptvf_send_msg_to_pf_timeout(cptvf, &mbx)) {
dev_err(&pdev->dev, "PF didn't respond to vf_type msg\n"); return -EBUSY;
} return 0;
}
/* * Communicate to PF that VF is UP and running
*/ int cptvf_send_vf_up(struct cpt_vf *cptvf)
{ struct pci_dev *pdev = cptvf->pdev; struct cpt_mbox mbx = {};
mbx.msg = CPT_MSG_VF_UP; if (cptvf_send_msg_to_pf_timeout(cptvf, &mbx)) {
dev_err(&pdev->dev, "PF didn't respond to UP msg\n"); return -EBUSY;
}
return 0;
}
/* * Communicate to PF that VF is DOWN and running
*/ int cptvf_send_vf_down(struct cpt_vf *cptvf)
{ struct pci_dev *pdev = cptvf->pdev; struct cpt_mbox mbx = {};
mbx.msg = CPT_MSG_VF_DOWN; if (cptvf_send_msg_to_pf_timeout(cptvf, &mbx)) {
dev_err(&pdev->dev, "PF didn't respond to DOWN msg\n"); return -EBUSY;
}
return 0;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.