Merge branch 'ISDN-irqsave-and-usb_fill_int_urb'
Sebastian Andrzej Siewior says: ==================== ISDN: use irqsave() in URB completion + usb_fill_int_urb This series is mostly about using _irqsave() primitives in the completion callback in order to get rid of local_irq_save() in __usb_hcd_giveback_urb(). While at it, I also tried to move drivers to use usb_fill_int_urb() otherwise it is hard find users of a certain API. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
b212ffa14d
|
@ -972,16 +972,14 @@ static int starturbs(struct bc_state *bcs)
|
|||
rc = -EFAULT;
|
||||
goto error;
|
||||
}
|
||||
usb_fill_int_urb(urb, bcs->cs->hw.bas->udev,
|
||||
usb_rcvisocpipe(urb->dev, 3 + 2 * bcs->channel),
|
||||
ubc->isoinbuf + k * BAS_INBUFSIZE,
|
||||
BAS_INBUFSIZE, read_iso_callback, bcs,
|
||||
BAS_FRAMETIME);
|
||||
|
||||
urb->dev = bcs->cs->hw.bas->udev;
|
||||
urb->pipe = usb_rcvisocpipe(urb->dev, 3 + 2 * bcs->channel);
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
urb->transfer_buffer = ubc->isoinbuf + k * BAS_INBUFSIZE;
|
||||
urb->transfer_buffer_length = BAS_INBUFSIZE;
|
||||
urb->number_of_packets = BAS_NUMFRAMES;
|
||||
urb->interval = BAS_FRAMETIME;
|
||||
urb->complete = read_iso_callback;
|
||||
urb->context = bcs;
|
||||
for (j = 0; j < BAS_NUMFRAMES; j++) {
|
||||
urb->iso_frame_desc[j].offset = j * BAS_MAXFRAME;
|
||||
urb->iso_frame_desc[j].length = BAS_MAXFRAME;
|
||||
|
@ -1005,15 +1003,15 @@ static int starturbs(struct bc_state *bcs)
|
|||
rc = -EFAULT;
|
||||
goto error;
|
||||
}
|
||||
urb->dev = bcs->cs->hw.bas->udev;
|
||||
urb->pipe = usb_sndisocpipe(urb->dev, 4 + 2 * bcs->channel);
|
||||
usb_fill_int_urb(urb, bcs->cs->hw.bas->udev,
|
||||
usb_sndisocpipe(urb->dev, 4 + 2 * bcs->channel),
|
||||
ubc->isooutbuf->data,
|
||||
sizeof(ubc->isooutbuf->data),
|
||||
write_iso_callback, &ubc->isoouturbs[k],
|
||||
BAS_FRAMETIME);
|
||||
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
urb->transfer_buffer = ubc->isooutbuf->data;
|
||||
urb->transfer_buffer_length = sizeof(ubc->isooutbuf->data);
|
||||
urb->number_of_packets = BAS_NUMFRAMES;
|
||||
urb->interval = BAS_FRAMETIME;
|
||||
urb->complete = write_iso_callback;
|
||||
urb->context = &ubc->isoouturbs[k];
|
||||
for (j = 0; j < BAS_NUMFRAMES; ++j) {
|
||||
urb->iso_frame_desc[j].offset = BAS_OUTBUFSIZE;
|
||||
urb->iso_frame_desc[j].length = BAS_NORMFRAME;
|
||||
|
|
|
@ -819,6 +819,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
int fifon = fifo->fifonum;
|
||||
int i;
|
||||
int hdlc = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (debug & DBG_HFC_CALL_TRACE)
|
||||
printk(KERN_DEBUG "%s: %s: fifo(%i) len(%i) "
|
||||
|
@ -835,7 +836,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
return;
|
||||
}
|
||||
|
||||
spin_lock(&hw->lock);
|
||||
spin_lock_irqsave(&hw->lock, flags);
|
||||
if (fifo->dch) {
|
||||
rx_skb = fifo->dch->rx_skb;
|
||||
maxlen = fifo->dch->maxlen;
|
||||
|
@ -844,7 +845,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
if (fifo->bch) {
|
||||
if (test_bit(FLG_RX_OFF, &fifo->bch->Flags)) {
|
||||
fifo->bch->dropcnt += len;
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
maxlen = bchannel_get_rxbuf(fifo->bch, len);
|
||||
|
@ -854,7 +855,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
skb_trim(rx_skb, 0);
|
||||
pr_warning("%s.B%d: No bufferspace for %d bytes\n",
|
||||
hw->name, fifo->bch->nr, len);
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
maxlen = fifo->bch->maxlen;
|
||||
|
@ -878,7 +879,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
} else {
|
||||
printk(KERN_DEBUG "%s: %s: No mem for rx_skb\n",
|
||||
hw->name, __func__);
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -888,7 +889,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
"for fifo(%d) HFCUSB_D_RX\n",
|
||||
hw->name, __func__, fifon);
|
||||
skb_trim(rx_skb, 0);
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -942,7 +943,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
|
|||
/* deliver transparent data to layer2 */
|
||||
recv_Bchannel(fifo->bch, MISDN_ID_ANY, false);
|
||||
}
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -979,18 +980,19 @@ rx_iso_complete(struct urb *urb)
|
|||
__u8 *buf;
|
||||
static __u8 eof[8];
|
||||
__u8 s0_state;
|
||||
unsigned long flags;
|
||||
|
||||
fifon = fifo->fifonum;
|
||||
status = urb->status;
|
||||
|
||||
spin_lock(&hw->lock);
|
||||
spin_lock_irqsave(&hw->lock, flags);
|
||||
if (fifo->stop_gracefull) {
|
||||
fifo->stop_gracefull = 0;
|
||||
fifo->active = 0;
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
|
||||
/*
|
||||
* ISO transfer only partially completed,
|
||||
|
@ -1096,15 +1098,16 @@ rx_int_complete(struct urb *urb)
|
|||
struct usb_fifo *fifo = (struct usb_fifo *) urb->context;
|
||||
struct hfcsusb *hw = fifo->hw;
|
||||
static __u8 eof[8];
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&hw->lock);
|
||||
spin_lock_irqsave(&hw->lock, flags);
|
||||
if (fifo->stop_gracefull) {
|
||||
fifo->stop_gracefull = 0;
|
||||
fifo->active = 0;
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
|
||||
fifon = fifo->fifonum;
|
||||
if ((!fifo->active) || (urb->status)) {
|
||||
|
@ -1172,12 +1175,13 @@ tx_iso_complete(struct urb *urb)
|
|||
int *tx_idx;
|
||||
int frame_complete, fifon, status, fillempty = 0;
|
||||
__u8 threshbit, *p;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&hw->lock);
|
||||
spin_lock_irqsave(&hw->lock, flags);
|
||||
if (fifo->stop_gracefull) {
|
||||
fifo->stop_gracefull = 0;
|
||||
fifo->active = 0;
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1195,7 +1199,7 @@ tx_iso_complete(struct urb *urb)
|
|||
} else {
|
||||
printk(KERN_DEBUG "%s: %s: neither BCH nor DCH\n",
|
||||
hw->name, __func__);
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1375,7 +1379,7 @@ tx_iso_complete(struct urb *urb)
|
|||
hw->name, __func__,
|
||||
symbolic(urb_errlist, status), status, fifon);
|
||||
}
|
||||
spin_unlock(&hw->lock);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -432,16 +432,12 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
|
|||
{
|
||||
int k;
|
||||
|
||||
urb->dev = dev;
|
||||
urb->pipe = pipe;
|
||||
urb->complete = complete;
|
||||
usb_fill_int_urb(urb, dev, pipe, buf, packet_size * num_packets,
|
||||
complete, context, interval);
|
||||
|
||||
urb->number_of_packets = num_packets;
|
||||
urb->transfer_buffer_length = packet_size * num_packets;
|
||||
urb->context = context;
|
||||
urb->transfer_buffer = buf;
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
urb->actual_length = 0;
|
||||
urb->interval = interval;
|
||||
for (k = 0; k < num_packets; k++) {
|
||||
urb->iso_frame_desc[k].offset = packet_size * k;
|
||||
urb->iso_frame_desc[k].length = packet_size;
|
||||
|
|
|
@ -408,15 +408,10 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev,
|
|||
{
|
||||
int k;
|
||||
|
||||
urb->dev = dev;
|
||||
urb->pipe = pipe;
|
||||
urb->interval = 1;
|
||||
urb->transfer_buffer = buf;
|
||||
usb_fill_int_urb(urb, dev, pipe, buf, num_packets * packet_size,
|
||||
complete, context, 1);
|
||||
|
||||
urb->number_of_packets = num_packets;
|
||||
urb->transfer_buffer_length = num_packets * packet_size;
|
||||
urb->actual_length = 0;
|
||||
urb->complete = complete;
|
||||
urb->context = context;
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
for (k = 0; k < num_packets; k++) {
|
||||
urb->iso_frame_desc[k].offset = packet_size * k;
|
||||
|
|
Загрузка…
Ссылка в новой задаче