aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/qedi/qedi_main.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 92775a8b74b1..997e3052a706 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -151,6 +151,11 @@ static int qedi_uio_close(struct uio_info *uinfo, struct inode *inode)
151 151
152static void __qedi_free_uio_rings(struct qedi_uio_dev *udev) 152static void __qedi_free_uio_rings(struct qedi_uio_dev *udev)
153{ 153{
154 if (udev->uctrl) {
155 free_page((unsigned long)udev->uctrl);
156 udev->uctrl = NULL;
157 }
158
154 if (udev->ll2_ring) { 159 if (udev->ll2_ring) {
155 free_page((unsigned long)udev->ll2_ring); 160 free_page((unsigned long)udev->ll2_ring);
156 udev->ll2_ring = NULL; 161 udev->ll2_ring = NULL;
@@ -169,7 +174,6 @@ static void __qedi_free_uio(struct qedi_uio_dev *udev)
169 __qedi_free_uio_rings(udev); 174 __qedi_free_uio_rings(udev);
170 175
171 pci_dev_put(udev->pdev); 176 pci_dev_put(udev->pdev);
172 kfree(udev->uctrl);
173 kfree(udev); 177 kfree(udev);
174} 178}
175 179
@@ -208,6 +212,11 @@ static int __qedi_alloc_uio_rings(struct qedi_uio_dev *udev)
208 if (udev->ll2_ring || udev->ll2_buf) 212 if (udev->ll2_ring || udev->ll2_buf)
209 return rc; 213 return rc;
210 214
215 /* Memory for control area. */
216 udev->uctrl = (void *)get_zeroed_page(GFP_KERNEL);
217 if (!udev->uctrl)
218 return -ENOMEM;
219
211 /* Allocating memory for LL2 ring */ 220 /* Allocating memory for LL2 ring */
212 udev->ll2_ring_size = QEDI_PAGE_SIZE; 221 udev->ll2_ring_size = QEDI_PAGE_SIZE;
213 udev->ll2_ring = (void *)get_zeroed_page(GFP_KERNEL | __GFP_COMP); 222 udev->ll2_ring = (void *)get_zeroed_page(GFP_KERNEL | __GFP_COMP);
@@ -237,7 +246,6 @@ exit_alloc_ring:
237static int qedi_alloc_uio_rings(struct qedi_ctx *qedi) 246static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
238{ 247{
239 struct qedi_uio_dev *udev = NULL; 248 struct qedi_uio_dev *udev = NULL;
240 struct qedi_uio_ctrl *uctrl = NULL;
241 int rc = 0; 249 int rc = 0;
242 250
243 list_for_each_entry(udev, &qedi_udev_list, list) { 251 list_for_each_entry(udev, &qedi_udev_list, list) {
@@ -258,21 +266,14 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
258 goto err_udev; 266 goto err_udev;
259 } 267 }
260 268
261 uctrl = kzalloc(sizeof(*uctrl), GFP_KERNEL);
262 if (!uctrl) {
263 rc = -ENOMEM;
264 goto err_uctrl;
265 }
266
267 udev->uio_dev = -1; 269 udev->uio_dev = -1;
268 270
269 udev->qedi = qedi; 271 udev->qedi = qedi;
270 udev->pdev = qedi->pdev; 272 udev->pdev = qedi->pdev;
271 udev->uctrl = uctrl;
272 273
273 rc = __qedi_alloc_uio_rings(udev); 274 rc = __qedi_alloc_uio_rings(udev);
274 if (rc) 275 if (rc)
275 goto err_uio_rings; 276 goto err_uctrl;
276 277
277 list_add(&udev->list, &qedi_udev_list); 278 list_add(&udev->list, &qedi_udev_list);
278 279
@@ -283,8 +284,6 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
283 udev->rx_pkt = udev->ll2_buf + LL2_SINGLE_BUF_SIZE; 284 udev->rx_pkt = udev->ll2_buf + LL2_SINGLE_BUF_SIZE;
284 return 0; 285 return 0;
285 286
286 err_uio_rings:
287 kfree(uctrl);
288 err_uctrl: 287 err_uctrl:
289 kfree(udev); 288 kfree(udev);
290 err_udev: 289 err_udev: