Commit 3f484a6e authored by David S. Miller's avatar David S. Miller

Merge branch 'usb-callbacks'

Sebastian Andrzej Siewior says:

====================
net/usb: Use irqsave in USB's complete callback

This is about using _irqsave() primitives in the completion callback in
order to get rid of local_irq_save() in __usb_hcd_giveback_urb().
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f79e7115 feae641d
...@@ -99,6 +99,7 @@ static void tx_complete(struct urb *req) ...@@ -99,6 +99,7 @@ static void tx_complete(struct urb *req)
struct net_device *dev = skb->dev; struct net_device *dev = skb->dev;
struct usbpn_dev *pnd = netdev_priv(dev); struct usbpn_dev *pnd = netdev_priv(dev);
int status = req->status; int status = req->status;
unsigned long flags;
switch (status) { switch (status) {
case 0: case 0:
...@@ -115,10 +116,10 @@ static void tx_complete(struct urb *req) ...@@ -115,10 +116,10 @@ static void tx_complete(struct urb *req)
} }
dev->stats.tx_packets++; dev->stats.tx_packets++;
spin_lock(&pnd->tx_lock); spin_lock_irqsave(&pnd->tx_lock, flags);
pnd->tx_queue--; pnd->tx_queue--;
netif_wake_queue(dev); netif_wake_queue(dev);
spin_unlock(&pnd->tx_lock); spin_unlock_irqrestore(&pnd->tx_lock, flags);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
usb_free_urb(req); usb_free_urb(req);
......
...@@ -999,6 +999,7 @@ static void read_bulk_callback(struct urb *urb) ...@@ -999,6 +999,7 @@ static void read_bulk_callback(struct urb *urb)
struct hso_net *odev = urb->context; struct hso_net *odev = urb->context;
struct net_device *net; struct net_device *net;
int result; int result;
unsigned long flags;
int status = urb->status; int status = urb->status;
/* is al ok? (Filip: Who's Al ?) */ /* is al ok? (Filip: Who's Al ?) */
...@@ -1028,11 +1029,11 @@ static void read_bulk_callback(struct urb *urb) ...@@ -1028,11 +1029,11 @@ static void read_bulk_callback(struct urb *urb)
if (urb->actual_length) { if (urb->actual_length) {
/* Handle the IP stream, add header and push it onto network /* Handle the IP stream, add header and push it onto network
* stack if the packet is complete. */ * stack if the packet is complete. */
spin_lock(&odev->net_lock); spin_lock_irqsave(&odev->net_lock, flags);
packetizeRx(odev, urb->transfer_buffer, urb->actual_length, packetizeRx(odev, urb->transfer_buffer, urb->actual_length,
(urb->transfer_buffer_length > (urb->transfer_buffer_length >
urb->actual_length) ? 1 : 0); urb->actual_length) ? 1 : 0);
spin_unlock(&odev->net_lock); spin_unlock_irqrestore(&odev->net_lock, flags);
} }
/* We are done with this URB, resubmit it. Prep the USB to wait for /* We are done with this URB, resubmit it. Prep the USB to wait for
...@@ -1193,6 +1194,7 @@ static void hso_std_serial_read_bulk_callback(struct urb *urb) ...@@ -1193,6 +1194,7 @@ static void hso_std_serial_read_bulk_callback(struct urb *urb)
{ {
struct hso_serial *serial = urb->context; struct hso_serial *serial = urb->context;
int status = urb->status; int status = urb->status;
unsigned long flags;
hso_dbg(0x8, "--- Got serial_read_bulk callback %02x ---\n", status); hso_dbg(0x8, "--- Got serial_read_bulk callback %02x ---\n", status);
...@@ -1216,10 +1218,10 @@ static void hso_std_serial_read_bulk_callback(struct urb *urb) ...@@ -1216,10 +1218,10 @@ static void hso_std_serial_read_bulk_callback(struct urb *urb)
if (serial->parent->port_spec & HSO_INFO_CRC_BUG) if (serial->parent->port_spec & HSO_INFO_CRC_BUG)
fix_crc_bug(urb, serial->in_endp->wMaxPacketSize); fix_crc_bug(urb, serial->in_endp->wMaxPacketSize);
/* Valid data, handle RX data */ /* Valid data, handle RX data */
spin_lock(&serial->serial_lock); spin_lock_irqsave(&serial->serial_lock, flags);
serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 1; serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 1;
put_rxbuf_data_and_resubmit_bulk_urb(serial); put_rxbuf_data_and_resubmit_bulk_urb(serial);
spin_unlock(&serial->serial_lock); spin_unlock_irqrestore(&serial->serial_lock, flags);
} }
/* /*
...@@ -1502,12 +1504,13 @@ static void tiocmget_intr_callback(struct urb *urb) ...@@ -1502,12 +1504,13 @@ static void tiocmget_intr_callback(struct urb *urb)
DUMP(serial_state_notification, DUMP(serial_state_notification,
sizeof(struct hso_serial_state_notification)); sizeof(struct hso_serial_state_notification));
} else { } else {
unsigned long flags;
UART_state_bitmap = le16_to_cpu(serial_state_notification-> UART_state_bitmap = le16_to_cpu(serial_state_notification->
UART_state_bitmap); UART_state_bitmap);
prev_UART_state_bitmap = tiocmget->prev_UART_state_bitmap; prev_UART_state_bitmap = tiocmget->prev_UART_state_bitmap;
icount = &tiocmget->icount; icount = &tiocmget->icount;
spin_lock(&serial->serial_lock); spin_lock_irqsave(&serial->serial_lock, flags);
if ((UART_state_bitmap & B_OVERRUN) != if ((UART_state_bitmap & B_OVERRUN) !=
(prev_UART_state_bitmap & B_OVERRUN)) (prev_UART_state_bitmap & B_OVERRUN))
icount->parity++; icount->parity++;
...@@ -1530,7 +1533,7 @@ static void tiocmget_intr_callback(struct urb *urb) ...@@ -1530,7 +1533,7 @@ static void tiocmget_intr_callback(struct urb *urb)
(prev_UART_state_bitmap & B_RX_CARRIER)) (prev_UART_state_bitmap & B_RX_CARRIER))
icount->dcd++; icount->dcd++;
tiocmget->prev_UART_state_bitmap = UART_state_bitmap; tiocmget->prev_UART_state_bitmap = UART_state_bitmap;
spin_unlock(&serial->serial_lock); spin_unlock_irqrestore(&serial->serial_lock, flags);
tiocmget->intr_completed = 1; tiocmget->intr_completed = 1;
wake_up_interruptible(&tiocmget->waitq); wake_up_interruptible(&tiocmget->waitq);
} }
...@@ -1852,6 +1855,7 @@ static void intr_callback(struct urb *urb) ...@@ -1852,6 +1855,7 @@ static void intr_callback(struct urb *urb)
struct hso_serial *serial; struct hso_serial *serial;
unsigned char *port_req; unsigned char *port_req;
int status = urb->status; int status = urb->status;
unsigned long flags;
int i; int i;
usb_mark_last_busy(urb->dev); usb_mark_last_busy(urb->dev);
...@@ -1879,7 +1883,7 @@ static void intr_callback(struct urb *urb) ...@@ -1879,7 +1883,7 @@ static void intr_callback(struct urb *urb)
if (serial != NULL) { if (serial != NULL) {
hso_dbg(0x1, "Pending read interrupt on port %d\n", hso_dbg(0x1, "Pending read interrupt on port %d\n",
i); i);
spin_lock(&serial->serial_lock); spin_lock_irqsave(&serial->serial_lock, flags);
if (serial->rx_state == RX_IDLE && if (serial->rx_state == RX_IDLE &&
serial->port.count > 0) { serial->port.count > 0) {
/* Setup and send a ctrl req read on /* Setup and send a ctrl req read on
...@@ -1893,7 +1897,8 @@ static void intr_callback(struct urb *urb) ...@@ -1893,7 +1897,8 @@ static void intr_callback(struct urb *urb)
hso_dbg(0x1, "Already a read pending on port %d or port not open\n", hso_dbg(0x1, "Already a read pending on port %d or port not open\n",
i); i);
} }
spin_unlock(&serial->serial_lock); spin_unlock_irqrestore(&serial->serial_lock,
flags);
} }
} }
} }
...@@ -1920,6 +1925,7 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb) ...@@ -1920,6 +1925,7 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb)
{ {
struct hso_serial *serial = urb->context; struct hso_serial *serial = urb->context;
int status = urb->status; int status = urb->status;
unsigned long flags;
/* sanity check */ /* sanity check */
if (!serial) { if (!serial) {
...@@ -1927,9 +1933,9 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb) ...@@ -1927,9 +1933,9 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb)
return; return;
} }
spin_lock(&serial->serial_lock); spin_lock_irqsave(&serial->serial_lock, flags);
serial->tx_urb_used = 0; serial->tx_urb_used = 0;
spin_unlock(&serial->serial_lock); spin_unlock_irqrestore(&serial->serial_lock, flags);
if (status) { if (status) {
handle_usb_error(status, __func__, serial->parent); handle_usb_error(status, __func__, serial->parent);
return; return;
...@@ -1971,14 +1977,15 @@ static void ctrl_callback(struct urb *urb) ...@@ -1971,14 +1977,15 @@ static void ctrl_callback(struct urb *urb)
struct hso_serial *serial = urb->context; struct hso_serial *serial = urb->context;
struct usb_ctrlrequest *req; struct usb_ctrlrequest *req;
int status = urb->status; int status = urb->status;
unsigned long flags;
/* sanity check */ /* sanity check */
if (!serial) if (!serial)
return; return;
spin_lock(&serial->serial_lock); spin_lock_irqsave(&serial->serial_lock, flags);
serial->tx_urb_used = 0; serial->tx_urb_used = 0;
spin_unlock(&serial->serial_lock); spin_unlock_irqrestore(&serial->serial_lock, flags);
if (status) { if (status) {
handle_usb_error(status, __func__, serial->parent); handle_usb_error(status, __func__, serial->parent);
return; return;
...@@ -1994,9 +2001,9 @@ static void ctrl_callback(struct urb *urb) ...@@ -1994,9 +2001,9 @@ static void ctrl_callback(struct urb *urb)
(USB_DIR_IN | USB_TYPE_OPTION_VENDOR | USB_RECIP_INTERFACE)) { (USB_DIR_IN | USB_TYPE_OPTION_VENDOR | USB_RECIP_INTERFACE)) {
/* response to a read command */ /* response to a read command */
serial->rx_urb_filled[0] = 1; serial->rx_urb_filled[0] = 1;
spin_lock(&serial->serial_lock); spin_lock_irqsave(&serial->serial_lock, flags);
put_rxbuf_data_and_resubmit_ctrl_urb(serial); put_rxbuf_data_and_resubmit_ctrl_urb(serial);
spin_unlock(&serial->serial_lock); spin_unlock_irqrestore(&serial->serial_lock, flags);
} else { } else {
hso_put_activity(serial->parent); hso_put_activity(serial->parent);
tty_port_tty_wakeup(&serial->port); tty_port_tty_wakeup(&serial->port);
......
...@@ -587,7 +587,7 @@ static void kaweth_usb_receive(struct urb *urb) ...@@ -587,7 +587,7 @@ static void kaweth_usb_receive(struct urb *urb)
struct kaweth_device *kaweth = urb->context; struct kaweth_device *kaweth = urb->context;
struct net_device *net = kaweth->net; struct net_device *net = kaweth->net;
int status = urb->status; int status = urb->status;
unsigned long flags;
int count = urb->actual_length; int count = urb->actual_length;
int count2 = urb->transfer_buffer_length; int count2 = urb->transfer_buffer_length;
...@@ -619,12 +619,12 @@ static void kaweth_usb_receive(struct urb *urb) ...@@ -619,12 +619,12 @@ static void kaweth_usb_receive(struct urb *urb)
net->stats.rx_errors++; net->stats.rx_errors++;
dev_dbg(dev, "Status was -EOVERFLOW.\n"); dev_dbg(dev, "Status was -EOVERFLOW.\n");
} }
spin_lock(&kaweth->device_lock); spin_lock_irqsave(&kaweth->device_lock, flags);
if (IS_BLOCKED(kaweth->status)) { if (IS_BLOCKED(kaweth->status)) {
spin_unlock(&kaweth->device_lock); spin_unlock_irqrestore(&kaweth->device_lock, flags);
return; return;
} }
spin_unlock(&kaweth->device_lock); spin_unlock_irqrestore(&kaweth->device_lock, flags);
if(status && status != -EREMOTEIO && count != 1) { if(status && status != -EREMOTEIO && count != 1) {
dev_err(&kaweth->intf->dev, dev_err(&kaweth->intf->dev,
......
...@@ -1252,6 +1252,7 @@ static void read_bulk_callback(struct urb *urb) ...@@ -1252,6 +1252,7 @@ static void read_bulk_callback(struct urb *urb)
int status = urb->status; int status = urb->status;
struct rx_agg *agg; struct rx_agg *agg;
struct r8152 *tp; struct r8152 *tp;
unsigned long flags;
agg = urb->context; agg = urb->context;
if (!agg) if (!agg)
...@@ -1281,9 +1282,9 @@ static void read_bulk_callback(struct urb *urb) ...@@ -1281,9 +1282,9 @@ static void read_bulk_callback(struct urb *urb)
if (urb->actual_length < ETH_ZLEN) if (urb->actual_length < ETH_ZLEN)
break; break;
spin_lock(&tp->rx_lock); spin_lock_irqsave(&tp->rx_lock, flags);
list_add_tail(&agg->list, &tp->rx_done); list_add_tail(&agg->list, &tp->rx_done);
spin_unlock(&tp->rx_lock); spin_unlock_irqrestore(&tp->rx_lock, flags);
napi_schedule(&tp->napi); napi_schedule(&tp->napi);
return; return;
case -ESHUTDOWN: case -ESHUTDOWN:
...@@ -1311,6 +1312,7 @@ static void write_bulk_callback(struct urb *urb) ...@@ -1311,6 +1312,7 @@ static void write_bulk_callback(struct urb *urb)
struct net_device *netdev; struct net_device *netdev;
struct tx_agg *agg; struct tx_agg *agg;
struct r8152 *tp; struct r8152 *tp;
unsigned long flags;
int status = urb->status; int status = urb->status;
agg = urb->context; agg = urb->context;
...@@ -1332,9 +1334,9 @@ static void write_bulk_callback(struct urb *urb) ...@@ -1332,9 +1334,9 @@ static void write_bulk_callback(struct urb *urb)
stats->tx_bytes += agg->skb_len; stats->tx_bytes += agg->skb_len;
} }
spin_lock(&tp->tx_lock); spin_lock_irqsave(&tp->tx_lock, flags);
list_add_tail(&agg->list, &tp->tx_free); list_add_tail(&agg->list, &tp->tx_free);
spin_unlock(&tp->tx_lock); spin_unlock_irqrestore(&tp->tx_lock, flags);
usb_autopm_put_interface_async(tp->intf); usb_autopm_put_interface_async(tp->intf);
......
...@@ -391,6 +391,7 @@ static void read_bulk_callback(struct urb *urb) ...@@ -391,6 +391,7 @@ static void read_bulk_callback(struct urb *urb)
u16 rx_stat; u16 rx_stat;
int status = urb->status; int status = urb->status;
int result; int result;
unsigned long flags;
dev = urb->context; dev = urb->context;
if (!dev) if (!dev)
...@@ -432,9 +433,9 @@ static void read_bulk_callback(struct urb *urb) ...@@ -432,9 +433,9 @@ static void read_bulk_callback(struct urb *urb)
netdev->stats.rx_packets++; netdev->stats.rx_packets++;
netdev->stats.rx_bytes += pkt_len; netdev->stats.rx_bytes += pkt_len;
spin_lock(&dev->rx_pool_lock); spin_lock_irqsave(&dev->rx_pool_lock, flags);
skb = pull_skb(dev); skb = pull_skb(dev);
spin_unlock(&dev->rx_pool_lock); spin_unlock_irqrestore(&dev->rx_pool_lock, flags);
if (!skb) if (!skb)
goto resched; goto resched;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment