aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qed/qed_main.c
diff options
context:
space:
mode:
authorMintz, Yuval <Yuval.Mintz@cavium.com>2017-06-04 06:31:07 -0400
committerDavid S. Miller <davem@davemloft.net>2017-06-04 23:08:31 -0400
commit1a850bfc9e71871599ddbc0d4d4cffa2dc409855 (patch)
treefdee2260dab407aa13d68a97c3bdfa5aa2e2f32c /drivers/net/ethernet/qlogic/qed/qed_main.c
parent08bc8f15e69cbd9f8e3d7bbba4814cec50d51cfe (diff)
qed: VFs to try utilizing the doorbell bar
VFs are currently not mapping their doorbell bar, instead relying on the small doorbell window they have in their limited regview bar. In order to increase the number of possible Tx connections [queues] employeed by VF past 16, we need to start using the doorbell bar if one such is exposed - VF would communicate this fact to PF which would return the size-bar internally configured into chip, according to which the VF would decide whether to actually utilize the doorbell bar. Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qed/qed_main.c')
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_main.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index 6ac10ce14e5b..9877d3e762fe 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -122,7 +122,7 @@ static void qed_free_pci(struct qed_dev *cdev)
122{ 122{
123 struct pci_dev *pdev = cdev->pdev; 123 struct pci_dev *pdev = cdev->pdev;
124 124
125 if (cdev->doorbells) 125 if (cdev->doorbells && cdev->db_size)
126 iounmap(cdev->doorbells); 126 iounmap(cdev->doorbells);
127 if (cdev->regview) 127 if (cdev->regview)
128 iounmap(cdev->regview); 128 iounmap(cdev->regview);
@@ -206,16 +206,24 @@ static int qed_init_pci(struct qed_dev *cdev, struct pci_dev *pdev)
206 goto err2; 206 goto err2;
207 } 207 }
208 208
209 if (IS_PF(cdev)) { 209 cdev->db_phys_addr = pci_resource_start(cdev->pdev, 2);
210 cdev->db_phys_addr = pci_resource_start(cdev->pdev, 2); 210 cdev->db_size = pci_resource_len(cdev->pdev, 2);
211 cdev->db_size = pci_resource_len(cdev->pdev, 2); 211 if (!cdev->db_size) {
212 cdev->doorbells = ioremap_wc(cdev->db_phys_addr, cdev->db_size); 212 if (IS_PF(cdev)) {
213 if (!cdev->doorbells) { 213 DP_NOTICE(cdev, "No Doorbell bar available\n");
214 DP_NOTICE(cdev, "Cannot map doorbell space\n"); 214 return -EINVAL;
215 return -ENOMEM; 215 } else {
216 return 0;
216 } 217 }
217 } 218 }
218 219
220 cdev->doorbells = ioremap_wc(cdev->db_phys_addr, cdev->db_size);
221
222 if (!cdev->doorbells) {
223 DP_NOTICE(cdev, "Cannot map doorbell space\n");
224 return -ENOMEM;
225 }
226
219 return 0; 227 return 0;
220 228
221err2: 229err2: