|
@@ -151,6 +151,11 @@ static int qedi_uio_close(struct uio_info *uinfo, struct inode *inode)
|
|
|
|
|
|
static void __qedi_free_uio_rings(struct qedi_uio_dev *udev)
|
|
|
{
|
|
|
+ if (udev->uctrl) {
|
|
|
+ free_page((unsigned long)udev->uctrl);
|
|
|
+ udev->uctrl = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
if (udev->ll2_ring) {
|
|
|
free_page((unsigned long)udev->ll2_ring);
|
|
|
udev->ll2_ring = NULL;
|
|
@@ -169,7 +174,6 @@ static void __qedi_free_uio(struct qedi_uio_dev *udev)
|
|
|
__qedi_free_uio_rings(udev);
|
|
|
|
|
|
pci_dev_put(udev->pdev);
|
|
|
- kfree(udev->uctrl);
|
|
|
kfree(udev);
|
|
|
}
|
|
|
|
|
@@ -208,6 +212,11 @@ static int __qedi_alloc_uio_rings(struct qedi_uio_dev *udev)
|
|
|
if (udev->ll2_ring || udev->ll2_buf)
|
|
|
return rc;
|
|
|
|
|
|
+ /* Memory for control area. */
|
|
|
+ udev->uctrl = (void *)get_zeroed_page(GFP_KERNEL);
|
|
|
+ if (!udev->uctrl)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
/* Allocating memory for LL2 ring */
|
|
|
udev->ll2_ring_size = QEDI_PAGE_SIZE;
|
|
|
udev->ll2_ring = (void *)get_zeroed_page(GFP_KERNEL | __GFP_COMP);
|
|
@@ -237,7 +246,6 @@ exit_alloc_ring:
|
|
|
static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
|
|
|
{
|
|
|
struct qedi_uio_dev *udev = NULL;
|
|
|
- struct qedi_uio_ctrl *uctrl = NULL;
|
|
|
int rc = 0;
|
|
|
|
|
|
list_for_each_entry(udev, &qedi_udev_list, list) {
|
|
@@ -258,21 +266,14 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
|
|
|
goto err_udev;
|
|
|
}
|
|
|
|
|
|
- uctrl = kzalloc(sizeof(*uctrl), GFP_KERNEL);
|
|
|
- if (!uctrl) {
|
|
|
- rc = -ENOMEM;
|
|
|
- goto err_uctrl;
|
|
|
- }
|
|
|
-
|
|
|
udev->uio_dev = -1;
|
|
|
|
|
|
udev->qedi = qedi;
|
|
|
udev->pdev = qedi->pdev;
|
|
|
- udev->uctrl = uctrl;
|
|
|
|
|
|
rc = __qedi_alloc_uio_rings(udev);
|
|
|
if (rc)
|
|
|
- goto err_uio_rings;
|
|
|
+ goto err_uctrl;
|
|
|
|
|
|
list_add(&udev->list, &qedi_udev_list);
|
|
|
|
|
@@ -283,8 +284,6 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
|
|
|
udev->rx_pkt = udev->ll2_buf + LL2_SINGLE_BUF_SIZE;
|
|
|
return 0;
|
|
|
|
|
|
- err_uio_rings:
|
|
|
- kfree(uctrl);
|
|
|
err_uctrl:
|
|
|
kfree(udev);
|
|
|
err_udev:
|