Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -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);
+21 −14
Original line number Original line Diff line number Diff line
@@ -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);
+4 −4
Original line number Original line Diff line number Diff line
@@ -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,
+6 −4
Original line number Original line Diff line number Diff line
@@ -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);


+3 −2
Original line number Original line Diff line number Diff line
@@ -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;