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: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
3f484a6e76
|
@ -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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
(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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
(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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче