> Fix the two following memory leaks in mt7663u_probe: > 1- if device power-own times out, remove ieee80211 hw device. > 2- if mt76u queues allocation fails, remove pending urbs. Hi Kalle, please drop this version since I spotted an issue, I am sending a v2. Regards, Lorenzo > > Fixes: eb99cc95c3b65 ("mt76: mt7615: introduce mt7663u support") > Signed-off-by: Lorenzo Bianconi <lorenzo@xxxxxxxxxx> > --- > .../net/wireless/mediatek/mt76/mt7615/usb.c | 10 ++++----- > drivers/net/wireless/mediatek/mt76/usb.c | 22 ++++++++++++++----- > 2 files changed, 22 insertions(+), 10 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c > index a50077eb24d7..18a4dd59b7e4 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c > @@ -329,25 +329,25 @@ static int mt7663u_probe(struct usb_interface *usb_intf, > if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON, > FW_STATE_PWR_ON << 1, 500)) { > dev_err(dev->mt76.dev, "Timeout for power on\n"); > - return -EIO; > + goto error; > } > > alloc_queues: > ret = mt76u_alloc_mcu_queue(&dev->mt76); > if (ret) > - goto error; > + goto error_free_q; > > ret = mt76u_alloc_queues(&dev->mt76); > if (ret) > - goto error; > + goto error_free_q; > > ret = mt7663u_register_device(dev); > if (ret) > - goto error_freeq; > + goto error_free_q; > > return 0; > > -error_freeq: > +error_free_q: > mt76u_queues_deinit(&dev->mt76); > error: > mt76u_deinit(&dev->mt76); > diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c > index fb97ea25b4d4..2e89b0514ff6 100644 > --- a/drivers/net/wireless/mediatek/mt76/usb.c > +++ b/drivers/net/wireless/mediatek/mt76/usb.c > @@ -1066,11 +1066,16 @@ static int mt76u_alloc_tx(struct mt76_dev *dev) > > static void mt76u_free_tx(struct mt76_dev *dev) > { > - struct mt76_queue *q; > - int i, j; > + int i; > > for (i = 0; i < IEEE80211_NUM_ACS; i++) { > + struct mt76_queue *q; > + int j; > + > q = dev->q_tx[i].q; > + if (!q) > + continue; > + > for (j = 0; j < q->ndesc; j++) > usb_free_urb(q->entry[j].urb); > } > @@ -1078,17 +1083,22 @@ static void mt76u_free_tx(struct mt76_dev *dev) > > void mt76u_stop_tx(struct mt76_dev *dev) > { > - struct mt76_queue_entry entry; > - struct mt76_queue *q; > - int i, j, ret; > + int ret; > > ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy), > HZ / 5); > if (!ret) { > + struct mt76_queue_entry entry; > + struct mt76_queue *q; > + int i, j; > + > dev_err(dev->dev, "timed out waiting for pending tx\n"); > > for (i = 0; i < IEEE80211_NUM_ACS; i++) { > q = dev->q_tx[i].q; > + if (!q) > + continue; > + > for (j = 0; j < q->ndesc; j++) > usb_kill_urb(q->entry[j].urb); > } > @@ -1100,6 +1110,8 @@ void mt76u_stop_tx(struct mt76_dev *dev) > */ > for (i = 0; i < IEEE80211_NUM_ACS; i++) { > q = dev->q_tx[i].q; > + if (!q) > + continue; > > /* Assure we are in sync with killed tasklet. */ > spin_lock_bh(&q->lock); > -- > 2.26.2 >
Attachment:
signature.asc
Description: PGP signature