diff options
| -rw-r--r-- | drivers/scsi/qedi/qedi_main.c | 23 |
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 | ||
| 152 | static void __qedi_free_uio_rings(struct qedi_uio_dev *udev) | 152 | static 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: | |||
| 237 | static int qedi_alloc_uio_rings(struct qedi_ctx *qedi) | 246 | static 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: |
