From bb457b472ce9a088f36d2130a6e8ef19088f10d1 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Sat, 19 Oct 2002 03:07:53 -0500 Subject: ISDN/PPP: Separate out and rewrite MPPP code The MPPP code was badly broken by the previous interface changes for ISDN network interfaces and sync-PPP, and in need of a serious cleanup. Now it's basically mostly rewritten, in a separate file but only lightly tested. --- include/linux/isdn.h | 17 ++++++++++++++--- include/linux/isdn_ppp.h | 16 ---------------- 2 files changed, 14 insertions(+), 19 deletions(-) (limited to 'include/linux') diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 0d0ce25b333e..362161a2ef76 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -312,6 +312,13 @@ struct isdn_netif_ops { void (*close)(struct isdn_net_local_s *); }; +typedef struct { + unsigned long seqerrs; + unsigned long frame_drops; + unsigned long overflows; + unsigned long max_queue_len; +} isdn_mppp_stats; + /* Local interface-data */ typedef struct isdn_net_local_s { ulong magic; @@ -357,8 +364,12 @@ typedef struct isdn_net_local_s { struct concap_device_ops *dops; /* callbacks used by encapsulator */ #endif #ifdef CONFIG_ISDN_PPP - unsigned int mpppcfg; - long mp_seqno; + unsigned int mp_cfg; + u32 mp_txseq; + struct sk_buff_head mp_frags; /* fragments sl list */ + u32 mp_rxseq; /* last processed packet seq #: any + packets with smaller seq # will + be dropped unconditionally */ struct ippp_ccp *ccp; unsigned long debug; #ifdef CONFIG_ISDN_PPP_VJ @@ -427,7 +438,7 @@ typedef struct isdn_net_dev_s { struct list_head global_list; /* global list of all isdn_net_devs */ #ifdef CONFIG_ISDN_PPP unsigned int pppcfg; - unsigned int pppseq; /* last seq no seen */ + u32 mp_rxseq; /* last seq no seen on this channel */ struct ippp_ccp *ccp; unsigned long debug; diff --git a/include/linux/isdn_ppp.h b/include/linux/isdn_ppp.h index ec6016c37421..b53107c1b1b4 100644 --- a/include/linux/isdn_ppp.h +++ b/include/linux/isdn_ppp.h @@ -130,24 +130,8 @@ struct isdn_ppp_compressor { extern int isdn_ppp_register_compressor(struct isdn_ppp_compressor *); extern int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *); -typedef struct { - unsigned long seqerrs; - unsigned long frame_drops; - unsigned long overflows; - unsigned long max_queue_len; -} isdn_mppp_stats; - typedef struct { int mp_mrru; /* unused */ - struct sk_buff * frags; /* fragments sl list -- use skb->next */ - long frames; /* number of frames in the frame list */ - unsigned int seq; /* last processed packet seq #: any packets - * with smaller seq # will be dropped - * unconditionally */ - spinlock_t lock; - int ref_ct; - /* statistics */ - isdn_mppp_stats stats; } ippp_bundle; #define IPPP_MAX_RQ_LEN 8 -- cgit v1.2.3 From bc2c10df3ca14e9ff199ee466d41139f2a58181e Mon Sep 17 00:00:00 2001 From: Josh Myer Date: Mon, 28 Oct 2002 23:20:41 -0800 Subject: [PATCH] Eliminate Old Prototypes from 2.5.44 Attached patch is the result of: dignity:~/src/linux-2.5.44 $ for x in `rgrep -l "FILL_.*URB" *`; do cp -v $x $x.backup; cat $x.backup | perl -pe 's/FILL_CONTROL_URB/usb_fill_control_urb/g; s/FILL_BULK_URB/usb_fill_bulk_urb/g; s/FILL_INT_URB/usb_fill_int_urb/g;' > $x; done and a manual removal of the define's in usb.h. --- Documentation/DocBook/writing_usb_driver.tmpl | 2 +- drivers/bluetooth/hci_usb.c | 8 ++++---- drivers/isdn/hisax/st5481_usb.c | 4 ++-- drivers/net/irda/irda-usb.c | 6 +++--- drivers/usb/class/bluetty.c | 18 +++++++++--------- drivers/usb/class/usb-midi.c | 4 ++-- drivers/usb/class/usblp.c | 4 ++-- drivers/usb/core/hub.c | 2 +- drivers/usb/core/message.c | 4 ++-- drivers/usb/image/hpusbscsi.c | 12 ++++++------ drivers/usb/image/mdc800.c | 6 +++--- drivers/usb/image/microtek.c | 4 ++-- drivers/usb/image/scanner.c | 2 +- drivers/usb/media/se401.c | 4 ++-- drivers/usb/misc/auerswald.c | 12 ++++++------ drivers/usb/misc/brlvger.c | 2 +- drivers/usb/misc/speedtouch.c | 8 ++++---- drivers/usb/net/catc.c | 8 ++++---- drivers/usb/net/cdc-ether.c | 6 +++--- drivers/usb/net/kaweth.c | 8 ++++---- drivers/usb/net/pegasus.c | 18 +++++++++--------- drivers/usb/net/rtl8150.c | 12 ++++++------ drivers/usb/net/usbnet.c | 6 +++--- drivers/usb/serial/cyberjack.c | 4 ++-- drivers/usb/serial/empeg.c | 6 +++--- drivers/usb/serial/ftdi_sio.c | 6 +++--- drivers/usb/serial/io_edgeport.c | 4 ++-- drivers/usb/serial/ipaq.c | 6 +++--- drivers/usb/serial/keyspan.c | 2 +- drivers/usb/serial/kl5kusb105.c | 6 +++--- drivers/usb/serial/mct_u232.c | 2 +- drivers/usb/serial/omninet.c | 4 ++-- drivers/usb/serial/safe_serial.c | 2 +- drivers/usb/storage/transport.c | 4 ++-- drivers/usb/storage/usb.c | 2 +- drivers/usb/usb-skeleton.c | 4 ++-- include/linux/usb.h | 11 ----------- sound/usb/usbmidi.c | 6 +++--- 38 files changed, 109 insertions(+), 120 deletions(-) (limited to 'include/linux') diff --git a/Documentation/DocBook/writing_usb_driver.tmpl b/Documentation/DocBook/writing_usb_driver.tmpl index 98d689b33529..8d971b0120fb 100644 --- a/Documentation/DocBook/writing_usb_driver.tmpl +++ b/Documentation/DocBook/writing_usb_driver.tmpl @@ -307,7 +307,7 @@ if (result) { When the write urb is filled up with the proper information using the - FILL_BULK_URB function, we point the urb's completion callback to call our + usb_fill_bulk_urb function, we point the urb's completion callback to call our own skel_write_bulk_callback function. This function is called when the urb is finished by the USB subsystem. The callback function is called in interrupt context, so caution must be taken not to do very much processing diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index ce6f9da59efc..708a1b75d18e 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c @@ -131,7 +131,7 @@ static int hci_usb_enable_intr(struct hci_usb *husb) pipe = usb_rcvintpipe(husb->udev, husb->intr_ep); size = usb_maxpacket(husb->udev, pipe, usb_pipeout(pipe)); - FILL_INT_URB(urb, husb->udev, pipe, buf, size, + usb_fill_int_urb(urb, husb->udev, pipe, buf, size, hci_usb_interrupt, husb, husb->intr_interval); return usb_submit_urb(urb, GFP_KERNEL); @@ -182,7 +182,7 @@ static int hci_usb_rx_submit(struct hci_usb *husb, struct urb *urb) pipe = usb_rcvbulkpipe(husb->udev, husb->bulk_in_ep); - FILL_BULK_URB(urb, husb->udev, pipe, skb->data, size, hci_usb_rx_complete, skb); + usb_fill_bulk_urb(urb, husb->udev, pipe, skb->data, size, hci_usb_rx_complete, skb); skb_queue_tail(&husb->pending_q, skb); err = usb_submit_urb(urb, GFP_ATOMIC); @@ -299,7 +299,7 @@ static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb) cr->wValue = 0; cr->wLength = __cpu_to_le16(skb->len); - FILL_CONTROL_URB(urb, husb->udev, pipe, (void *) cr, + usb_fill_control_urb(urb, husb->udev, pipe, (void *) cr, skb->data, skb->len, hci_usb_tx_complete, skb); BT_DBG("%s urb %p len %d", husb->hdev.name, urb, skb->len); @@ -328,7 +328,7 @@ static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb) pipe = usb_sndbulkpipe(husb->udev, husb->bulk_out_ep); - FILL_BULK_URB(urb, husb->udev, pipe, skb->data, skb->len, + usb_fill_bulk_urb(urb, husb->udev, pipe, skb->data, skb->len, hci_usb_tx_complete, skb); urb->transfer_flags = USB_ZERO_PACKET; diff --git a/drivers/isdn/hisax/st5481_usb.c b/drivers/isdn/hisax/st5481_usb.c index be2d213318b8..76536eb5d75e 100644 --- a/drivers/isdn/hisax/st5481_usb.c +++ b/drivers/isdn/hisax/st5481_usb.c @@ -284,7 +284,7 @@ int __devinit st5481_setup_usb(struct st5481_adapter *adapter) ctrl->urb = urb; // Fill the control URB - FILL_CONTROL_URB (urb, dev, + usb_fill_control_urb (urb, dev, usb_sndctrlpipe(dev, 0), NULL, NULL, 0, usb_ctrl_complete, adapter); @@ -306,7 +306,7 @@ int __devinit st5481_setup_usb(struct st5481_adapter *adapter) endpoint = &altsetting->endpoint[EP_INT-1]; // Fill the interrupt URB - FILL_INT_URB(urb, dev, + usb_fill_int_urb(urb, dev, usb_rcvintpipe(dev, endpoint->bEndpointAddress), buf, INT_PKT_SIZE, usb_int_complete, adapter, diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index cddfe9c33804..a88314c7a459 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c @@ -265,7 +265,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self) irda_usb_build_header(self, frame, 1); /* Submit the 0 length IrDA frame to trigger new speed settings */ - FILL_BULK_URB(urb, self->usbdev, + usb_fill_bulk_urb(urb, self->usbdev, usb_sndbulkpipe(self->usbdev, self->bulk_out_ep), frame, IRDA_USB_SPEED_MTU, speed_bulk_callback, self); @@ -400,7 +400,7 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) /* FIXME: Make macro out of this one */ ((struct irda_skb_cb *)skb->cb)->context = self; - FILL_BULK_URB(urb, self->usbdev, + usb_fill_bulk_urb(urb, self->usbdev, usb_sndbulkpipe(self->usbdev, self->bulk_out_ep), skb->data, IRDA_USB_MAX_MTU, write_bulk_callback, skb); @@ -729,7 +729,7 @@ static void irda_usb_submit(struct irda_usb_cb *self, struct sk_buff *skb, struc cb->context = self; /* Reinitialize URB */ - FILL_BULK_URB(urb, self->usbdev, + usb_fill_bulk_urb(urb, self->usbdev, usb_rcvbulkpipe(self->usbdev, self->bulk_in_ep), skb->data, skb->truesize, irda_usb_receive, skb); diff --git a/drivers/usb/class/bluetty.c b/drivers/usb/class/bluetty.c index b78fcb009ea4..bf41336639ec 100644 --- a/drivers/usb/class/bluetty.c +++ b/drivers/usb/class/bluetty.c @@ -328,7 +328,7 @@ static int bluetooth_ctrl_msg (struct usb_bluetooth *bluetooth, int request, int dr->wIndex = cpu_to_le16((u16) bluetooth->control_out_bInterfaceNum); dr->wLength = cpu_to_le16((u16) len); - FILL_CONTROL_URB (urb, bluetooth->dev, usb_sndctrlpipe(bluetooth->dev, 0), + usb_fill_control_urb (urb, bluetooth->dev, usb_sndctrlpipe(bluetooth->dev, 0), (unsigned char*)dr, urb->transfer_buffer, len, bluetooth_ctrl_callback, bluetooth); /* send it down the pipe */ @@ -382,7 +382,7 @@ static int bluetooth_open (struct tty_struct *tty, struct file * filp) #ifndef BTBUGGYHARDWARE /* Start reading from the device */ - FILL_BULK_URB (bluetooth->read_urb, bluetooth->dev, + usb_fill_bulk_urb (bluetooth->read_urb, bluetooth->dev, usb_rcvbulkpipe(bluetooth->dev, bluetooth->bulk_in_endpointAddress), bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, @@ -391,7 +391,7 @@ static int bluetooth_open (struct tty_struct *tty, struct file * filp) if (result) dbg("%s - usb_submit_urb(read bulk) failed with status %d", __FUNCTION__, result); #endif - FILL_INT_URB (bluetooth->interrupt_in_urb, bluetooth->dev, + usb_fill_int_urb (bluetooth->interrupt_in_urb, bluetooth->dev, usb_rcvintpipe(bluetooth->dev, bluetooth->interrupt_in_endpointAddress), bluetooth->interrupt_in_buffer, bluetooth->interrupt_in_buffer_size, @@ -535,7 +535,7 @@ static int bluetooth_write (struct tty_struct * tty, int from_user, const unsign memcpy (urb->transfer_buffer, current_position, buffer_size); /* build up our urb */ - FILL_BULK_URB (urb, bluetooth->dev, usb_sndbulkpipe(bluetooth->dev, bluetooth->bulk_out_endpointAddress), + usb_fill_bulk_urb (urb, bluetooth->dev, usb_sndbulkpipe(bluetooth->dev, bluetooth->bulk_out_endpointAddress), urb->transfer_buffer, buffer_size, bluetooth_write_bulk_callback, bluetooth); /* send it down the pipe */ @@ -725,7 +725,7 @@ void btusb_enable_bulk_read(struct tty_struct *tty){ } if (bluetooth->read_urb) { - FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, + usb_fill_bulk_urb(bluetooth->read_urb, bluetooth->dev, usb_rcvbulkpipe(bluetooth->dev, bluetooth->bulk_in_endpointAddress), bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, bluetooth_read_bulk_callback, bluetooth); @@ -933,7 +933,7 @@ static void bluetooth_read_bulk_callback (struct urb *urb) if ((count == 4) && (data[0] == 0x00) && (data[1] == 0x00) && (data[2] == 0x00) && (data[3] == 0x00)) { urb->actual_length = 0; - FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, + usb_fill_bulk_urb(bluetooth->read_urb, bluetooth->dev, usb_rcvbulkpipe(bluetooth->dev, bluetooth->bulk_in_endpointAddress), bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, bluetooth_read_bulk_callback, bluetooth); @@ -994,7 +994,7 @@ exit: if (!bluetooth || !bluetooth->open_count) return; - FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, + usb_fill_bulk_urb(bluetooth->read_urb, bluetooth->dev, usb_rcvbulkpipe(bluetooth->dev, bluetooth->bulk_in_endpointAddress), bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, bluetooth_read_bulk_callback, bluetooth); @@ -1160,7 +1160,7 @@ static int usb_bluetooth_probe (struct usb_interface *intf, err("Couldn't allocate bulk_in_buffer"); goto probe_error; } - FILL_BULK_URB(bluetooth->read_urb, dev, usb_rcvbulkpipe(dev, endpoint->bEndpointAddress), + usb_fill_bulk_urb(bluetooth->read_urb, dev, usb_rcvbulkpipe(dev, endpoint->bEndpointAddress), bluetooth->bulk_in_buffer, buffer_size, bluetooth_read_bulk_callback, bluetooth); endpoint = bulk_out_endpoint[0]; @@ -1196,7 +1196,7 @@ static int usb_bluetooth_probe (struct usb_interface *intf, err("Couldn't allocate interrupt_in_buffer"); goto probe_error; } - FILL_INT_URB(bluetooth->interrupt_in_urb, dev, usb_rcvintpipe(dev, endpoint->bEndpointAddress), + usb_fill_int_urb(bluetooth->interrupt_in_urb, dev, usb_rcvintpipe(dev, endpoint->bEndpointAddress), bluetooth->interrupt_in_buffer, buffer_size, bluetooth_int_callback, bluetooth, endpoint->bInterval); diff --git a/drivers/usb/class/usb-midi.c b/drivers/usb/class/usb-midi.c index 87d65953ed88..fdeea3ec0bb0 100644 --- a/drivers/usb/class/usb-midi.c +++ b/drivers/usb/class/usb-midi.c @@ -330,7 +330,7 @@ static int usb_write( struct midi_out_endpoint *ep, unsigned char *buf, int len d = ep->usbdev; pipe = usb_sndbulkpipe(d, ep->endpoint); - FILL_BULK_URB( ep->urb, d, pipe, (unsigned char*)buf, len, + usb_fill_bulk_urb( ep->urb, d, pipe, (unsigned char*)buf, len, (usb_complete_t)usb_write_callback, ep ); status = usb_submit_urb(ep->urb, GFP_KERNEL); @@ -1045,7 +1045,7 @@ static struct midi_in_endpoint *alloc_midi_in_endpoint( struct usb_device *d, in kfree(ep); return NULL; } - FILL_BULK_URB( ep->urb, d, + usb_fill_bulk_urb( ep->urb, d, usb_rcvbulkpipe(d, endPoint), (unsigned char *)ep->recvBuf, bufSize, (usb_complete_t)usb_bulk_read, ep ); diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 0d9719dffe22..c2103b175260 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -1018,7 +1018,7 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol) return r; } - FILL_BULK_URB(usblp->writeurb, usblp->dev, + usb_fill_bulk_urb(usblp->writeurb, usblp->dev, usb_sndbulkpipe(usblp->dev, usblp->protocol[protocol].epwrite->bEndpointAddress), usblp->buf, 0, @@ -1026,7 +1026,7 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol) usblp->bidir = (usblp->protocol[protocol].epread != 0); if (usblp->bidir) - FILL_BULK_URB(usblp->readurb, usblp->dev, + usb_fill_bulk_urb(usblp->readurb, usblp->dev, usb_rcvbulkpipe(usblp->dev, usblp->protocol[protocol].epread->bEndpointAddress), usblp->buf + USBLP_BUF_SIZE, USBLP_BUF_SIZE, diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 28712be6a473..4aad0b4a6a09 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -418,7 +418,7 @@ static int usb_hub_configure(struct usb_hub *hub, return -1; } - FILL_INT_URB(hub->urb, dev, pipe, hub->buffer, maxp, hub_irq, + usb_fill_int_urb(hub->urb, dev, pipe, hub->buffer, maxp, hub_irq, hub, endpoint->bInterval); ret = usb_submit_urb(hub->urb, GFP_KERNEL); if (ret) { diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 16e3e8b43f2b..021cd1ff7d3a 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -92,7 +92,7 @@ int usb_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe, if (!urb) return -ENOMEM; - FILL_CONTROL_URB(urb, usb_dev, pipe, (unsigned char*)cmd, data, len, + usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data, len, usb_api_blocking_completion, 0); retv = usb_start_wait_urb(urb, timeout, &length); @@ -190,7 +190,7 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, if (!urb) return -ENOMEM; - FILL_BULK_URB(urb, usb_dev, pipe, data, len, + usb_fill_bulk_urb(urb, usb_dev, pipe, data, len, usb_api_blocking_completion, 0); return usb_start_wait_urb(urb,timeout,actual_length); diff --git a/drivers/usb/image/hpusbscsi.c b/drivers/usb/image/hpusbscsi.c index 543120598118..0f20f949274a 100644 --- a/drivers/usb/image/hpusbscsi.c +++ b/drivers/usb/image/hpusbscsi.c @@ -244,7 +244,7 @@ hpusbscsi_scsi_detect (struct SHT *sht) sht->proc_dir = NULL; /* build and submit an interrupt URB for status byte handling */ - FILL_INT_URB(desc->controlurb, + usb_fill_int_urb(desc->controlurb, desc->dev, usb_rcvintpipe(desc->dev,desc->ep_int), &desc->scsi_state_byte, @@ -321,7 +321,7 @@ static int hpusbscsi_scsi_queuecommand (Scsi_Cmnd *srb, scsi_callback callback) TRACE_STATE; /* We prepare the urb for writing out the scsi command */ - FILL_BULK_URB( + usb_fill_bulk_urb( hpusbscsi->dataurb, hpusbscsi->dev, usb_sndbulkpipe(hpusbscsi->dev,hpusbscsi->ep_out), @@ -477,7 +477,7 @@ static void scatter_gather_callback(struct urb *u) hpusbscsi->state = HP_STATE_WORKING; TRACE_STATE; - FILL_BULK_URB( + usb_fill_bulk_urb( u, hpusbscsi->dev, hpusbscsi->current_data_pipe, @@ -531,7 +531,7 @@ static void simple_payload_callback (struct urb *u) return; } - FILL_BULK_URB( + usb_fill_bulk_urb( u, hpusbscsi->dev, hpusbscsi->current_data_pipe, @@ -562,7 +562,7 @@ static void request_sense_callback (struct urb *u) return; } - FILL_BULK_URB( + usb_fill_bulk_urb( u, hpusbscsi->dev, hpusbscsi->current_data_pipe, @@ -582,7 +582,7 @@ static void request_sense_callback (struct urb *u) static void issue_request_sense (struct hpusbscsi *hpusbscsi) { - FILL_BULK_URB( + usb_fill_bulk_urb( hpusbscsi->dataurb, hpusbscsi->dev, usb_sndbulkpipe(hpusbscsi->dev, hpusbscsi->ep_out), diff --git a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c index 12aafe9b9eb7..f88094fb95fa 100644 --- a/drivers/usb/image/mdc800.c +++ b/drivers/usb/image/mdc800.c @@ -488,7 +488,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, mdc800->open=0; /* Setup URB Structs */ - FILL_INT_URB ( + usb_fill_int_urb ( mdc800->irq_urb, mdc800->dev, usb_rcvintpipe (mdc800->dev,mdc800->endpoint [1]), @@ -499,7 +499,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, irq_interval ); - FILL_BULK_URB ( + usb_fill_bulk_urb ( mdc800->write_urb, mdc800->dev, usb_sndbulkpipe (mdc800->dev, mdc800->endpoint[0]), @@ -509,7 +509,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, mdc800 ); - FILL_BULK_URB ( + usb_fill_bulk_urb ( mdc800->download_urb, mdc800->dev, usb_rcvbulkpipe (mdc800->dev, mdc800->endpoint [3]), diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index b4c63efc381a..a9a21048930a 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c @@ -487,7 +487,7 @@ void mts_int_submit_urb (struct urb* transfer, MTS_INT_INIT(); - FILL_BULK_URB(transfer, + usb_fill_bulk_urb(transfer, context->instance->usb_dev, pipe, data, @@ -715,7 +715,7 @@ int mts_scsi_queuecommand( Scsi_Cmnd *srb, mts_scsi_cmnd_callback callback ) } - FILL_BULK_URB(desc->urb, + usb_fill_bulk_urb(desc->urb, desc->usb_dev, usb_sndbulkpipe(desc->usb_dev,desc->ep_out), srb->cmnd, diff --git a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c index 0e0ae383acd5..e86daf15fb4f 100644 --- a/drivers/usb/image/scanner.c +++ b/drivers/usb/image/scanner.c @@ -1024,7 +1024,7 @@ probe_scanner(struct usb_interface *intf, /* Ok, if we detected an interrupt EP, setup a handler for it */ if (have_intr) { dbg("probe_scanner(%d): Configuring IRQ handler for intr EP:%d", scn_minor, have_intr); - FILL_INT_URB(scn->scn_irq, dev, + usb_fill_int_urb(scn->scn_irq, dev, usb_rcvintpipe(dev, have_intr), &scn->button, 1, irq_scanner, scn, // endpoint[(int)have_intr].bInterval); diff --git a/drivers/usb/media/se401.c b/drivers/usb/media/se401.c index 87029897b56d..01390ade20e6 100644 --- a/drivers/usb/media/se401.c +++ b/drivers/usb/media/se401.c @@ -609,7 +609,7 @@ static int se401_start_stream(struct usb_se401 *se401) if(!urb) return -ENOMEM; - FILL_BULK_URB(urb, se401->dev, + usb_fill_bulk_urb(urb, se401->dev, usb_rcvbulkpipe(se401->dev, SE401_VIDEO_ENDPOINT), se401->sbuf[i].data, SE401_PACKETSIZE, se401_video_irq, @@ -1420,7 +1420,7 @@ static int se401_init(struct usb_se401 *se401, int button) info("Allocation of inturb failed"); return 1; } - FILL_INT_URB(se401->inturb, se401->dev, + usb_fill_int_urb(se401->inturb, se401->dev, usb_rcvintpipe(se401->dev, SE401_BUTTON_ENDPOINT), &se401->button, sizeof(se401->button), se401_button_irq, diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index beac2aba435f..23a1b8cb4d4e 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c @@ -717,7 +717,7 @@ static int auerchain_control_msg (pauerchain_t acp, struct usb_device *dev, unsi dr->wIndex = cpu_to_le16 (index); dr->wLength = cpu_to_le16 (size); - FILL_CONTROL_URB (urb, dev, pipe, (unsigned char*)dr, data, size, /* build urb */ + usb_fill_control_urb (urb, dev, pipe, (unsigned char*)dr, data, size, /* build urb */ (usb_complete_t)auerchain_blocking_completion,0); ret = auerchain_start_wait_urb (acp, urb, timeout, &length); @@ -919,7 +919,7 @@ static void auerswald_ctrlread_wretcomplete (struct urb * urb) bp->dr->wLength = bp->dr->wValue; /* temporary stored */ bp->dr->wValue = cpu_to_le16 (1); /* Retry Flag */ /* bp->dr->index = channel id; remains */ - FILL_CONTROL_URB (bp->urbp, cp->usbdev, usb_rcvctrlpipe (cp->usbdev, 0), + usb_fill_control_urb (bp->urbp, cp->usbdev, usb_rcvctrlpipe (cp->usbdev, 0), (unsigned char*)bp->dr, bp->bufp, le16_to_cpu (bp->dr->wLength), (usb_complete_t)auerswald_ctrlread_complete,bp); @@ -967,7 +967,7 @@ static void auerswald_ctrlread_complete (struct urb * urb) bp->dr->wValue = bp->dr->wLength; /* temporary storage */ // bp->dr->wIndex channel ID remains bp->dr->wLength = cpu_to_le16 (32); /* >= 8 bytes */ - FILL_CONTROL_URB (bp->urbp, cp->usbdev, usb_sndctrlpipe (cp->usbdev, 0), + usb_fill_control_urb (bp->urbp, cp->usbdev, usb_sndctrlpipe (cp->usbdev, 0), (unsigned char*)bp->dr, bp->bufp, 32, (usb_complete_t)auerswald_ctrlread_wretcomplete,bp); @@ -1095,7 +1095,7 @@ static void auerswald_int_complete (struct urb * urb) bp->dr->wValue = cpu_to_le16 (0); bp->dr->wIndex = cpu_to_le16 (channelid | AUH_DIRECT | AUH_UNSPLIT); bp->dr->wLength = cpu_to_le16 (bytecount); - FILL_CONTROL_URB (bp->urbp, cp->usbdev, usb_rcvctrlpipe (cp->usbdev, 0), + usb_fill_control_urb (bp->urbp, cp->usbdev, usb_rcvctrlpipe (cp->usbdev, 0), (unsigned char*)bp->dr, bp->bufp, bytecount, (usb_complete_t)auerswald_ctrlread_complete,bp); @@ -1164,7 +1164,7 @@ static int auerswald_int_open (pauerswald_t cp) } } /* setup urb */ - FILL_INT_URB (cp->inturbp, cp->usbdev, usb_rcvintpipe (cp->usbdev,AU_IRQENDP), cp->intbufp, irqsize, auerswald_int_complete, cp, ep->bInterval); + usb_fill_int_urb (cp->inturbp, cp->usbdev, usb_rcvintpipe (cp->usbdev,AU_IRQENDP), cp->intbufp, irqsize, auerswald_int_complete, cp, ep->bInterval); /* start the urb */ cp->inturbp->status = 0; /* needed! */ ret = usb_submit_urb (cp->inturbp, GFP_KERNEL); @@ -1830,7 +1830,7 @@ write_again: bp->dr->wValue = cpu_to_le16 (0); bp->dr->wIndex = cpu_to_le16 (ccp->scontext.id | AUH_DIRECT | AUH_UNSPLIT); bp->dr->wLength = cpu_to_le16 (len+AUH_SIZE); - FILL_CONTROL_URB (bp->urbp, cp->usbdev, usb_sndctrlpipe (cp->usbdev, 0), + usb_fill_control_urb (bp->urbp, cp->usbdev, usb_sndctrlpipe (cp->usbdev, 0), (unsigned char*)bp->dr, bp->bufp, len+AUH_SIZE, auerchar_ctrlwrite_complete, bp); /* up we go */ diff --git a/drivers/usb/misc/brlvger.c b/drivers/usb/misc/brlvger.c index 88634bd49162..89b1e90b2719 100644 --- a/drivers/usb/misc/brlvger.c +++ b/drivers/usb/misc/brlvger.c @@ -514,7 +514,7 @@ brlvger_open(struct inode *inode, struct file *file) err("Unable to allocate URB"); goto error; } - FILL_INT_URB( priv->intr_urb, priv->dev, + usb_fill_int_urb( priv->intr_urb, priv->dev, usb_rcvintpipe(priv->dev, priv->in_interrupt->bEndpointAddress), priv->intr_buff, sizeof(priv->intr_buff), diff --git a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c index 45bdd24700b2..fae8e61320f4 100644 --- a/drivers/usb/misc/speedtouch.c +++ b/drivers/usb/misc/speedtouch.c @@ -592,7 +592,7 @@ static void udsl_usb_send_data_complete (struct urb *urb) ctx->skb = skb_dequeue (&(instance->sndqueue)); ctx->vcc = ((struct udsl_cb *) (ctx->skb->cb))->vcc; spin_unlock_irqrestore (&instance->sndqlock, flags); - FILL_BULK_URB (urb, + usb_fill_bulk_urb (urb, instance->usb_dev, usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT), (unsigned char *) ctx->skb->data, @@ -673,7 +673,7 @@ int udsl_usb_send_data (struct udsl_instance_data *instance, struct atm_vcc *vcc spin_unlock_irqrestore (&instance->sndqlock, flags); /* submit packet */ - FILL_BULK_URB (urb, + usb_fill_bulk_urb (urb, instance->usb_dev, usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT), (unsigned char *) skb->data, @@ -742,7 +742,7 @@ void udsl_usb_data_receive (struct urb *urb) return; } - FILL_BULK_URB (urb, + usb_fill_bulk_urb (urb, instance->usb_dev, usb_rcvbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_IN), (unsigned char *) ctx->skb->data, @@ -790,7 +790,7 @@ int udsl_usb_data_init (struct udsl_instance_data *instance) break; }; - FILL_BULK_URB (ctx->urb, + usb_fill_bulk_urb (ctx->urb, instance->usb_dev, usb_rcvbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_IN), (unsigned char *) ctx->skb->data, diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c index 84cf473b7bed..3a50bdd7b03a 100644 --- a/drivers/usb/net/catc.c +++ b/drivers/usb/net/catc.c @@ -847,16 +847,16 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id pktsz = RX_MAX_BURST * (PKT_SZ + 2); } - FILL_CONTROL_URB(catc->ctrl_urb, usbdev, usb_sndctrlpipe(usbdev, 0), + usb_fill_control_urb(catc->ctrl_urb, usbdev, usb_sndctrlpipe(usbdev, 0), NULL, NULL, 0, catc_ctrl_done, catc); - FILL_BULK_URB(catc->tx_urb, usbdev, usb_sndbulkpipe(usbdev, 1), + usb_fill_bulk_urb(catc->tx_urb, usbdev, usb_sndbulkpipe(usbdev, 1), NULL, 0, catc_tx_done, catc); - FILL_BULK_URB(catc->rx_urb, usbdev, usb_rcvbulkpipe(usbdev, 1), + usb_fill_bulk_urb(catc->rx_urb, usbdev, usb_rcvbulkpipe(usbdev, 1), catc->rx_buf, pktsz, catc_rx_done, catc); - FILL_INT_URB(catc->irq_urb, usbdev, usb_rcvintpipe(usbdev, 2), + usb_fill_int_urb(catc->irq_urb, usbdev, usb_rcvintpipe(usbdev, 2), catc->irq_buf, 2, catc_irq_done, catc, 1); if (!catc->is_f5u011) { diff --git a/drivers/usb/net/cdc-ether.c b/drivers/usb/net/cdc-ether.c index 513f83c9bda1..c370ea0b75b5 100644 --- a/drivers/usb/net/cdc-ether.c +++ b/drivers/usb/net/cdc-ether.c @@ -125,7 +125,7 @@ static void read_bulk_callback( struct urb *urb ) goon: // Prep the USB to wait for another frame - FILL_BULK_URB( ether_dev->rx_urb, ether_dev->usb, + usb_fill_bulk_urb( ether_dev->rx_urb, ether_dev->usb, usb_rcvbulkpipe(ether_dev->usb, ether_dev->data_ep_in), ether_dev->rx_buff, ether_dev->wMaxSegmentSize, read_bulk_callback, ether_dev ); @@ -293,7 +293,7 @@ static int CDCEther_start_xmit( struct sk_buff *skb, struct net_device *net ) memcpy(ether_dev->tx_buff, skb->data, skb->len); // Fill in the URB for shipping it out. - FILL_BULK_URB( ether_dev->tx_urb, ether_dev->usb, + usb_fill_bulk_urb( ether_dev->tx_urb, ether_dev->usb, usb_sndbulkpipe(ether_dev->usb, ether_dev->data_ep_out), ether_dev->tx_buff, ether_dev->wMaxSegmentSize, write_bulk_callback, ether_dev ); @@ -344,7 +344,7 @@ static int CDCEther_open(struct net_device *net) } // Prep a receive URB - FILL_BULK_URB( ether_dev->rx_urb, ether_dev->usb, + usb_fill_bulk_urb( ether_dev->rx_urb, ether_dev->usb, usb_rcvbulkpipe(ether_dev->usb, ether_dev->data_ep_in), ether_dev->rx_buff, ether_dev->wMaxSegmentSize, read_bulk_callback, ether_dev ); diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c index cea07c41875b..16852bf313db 100644 --- a/drivers/usb/net/kaweth.c +++ b/drivers/usb/net/kaweth.c @@ -514,7 +514,7 @@ static int kaweth_resubmit_rx_urb(struct kaweth_device *kaweth, { int result; - FILL_BULK_URB(kaweth->rx_urb, + usb_fill_bulk_urb(kaweth->rx_urb, kaweth->dev, usb_rcvbulkpipe(kaweth->dev, 1), kaweth->rx_buf, @@ -620,7 +620,7 @@ static int kaweth_open(struct net_device *net) if (res) return -EIO; - FILL_INT_URB( + usb_fill_int_urb( kaweth->irq_urb, kaweth->dev, usb_rcvintpipe(kaweth->dev, 3), @@ -752,7 +752,7 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) *private_header = cpu_to_le16(skb->len); kaweth->tx_skb = skb; - FILL_BULK_URB(kaweth->tx_urb, + usb_fill_bulk_urb(kaweth->tx_urb, kaweth->dev, usb_sndbulkpipe(kaweth->dev, 2), private_header, @@ -1207,7 +1207,7 @@ int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe, if (!urb) return -ENOMEM; - FILL_CONTROL_URB(urb, usb_dev, pipe, (unsigned char*)cmd, data, + usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data, len, (usb_complete_t)usb_api_blocking_completion,0); retv = usb_start_wait_urb(urb, timeout, &length); diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 19f3b82d54fc..c90c771a9bc8 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c @@ -143,7 +143,7 @@ static int get_registers(pegasus_t * pegasus, __u16 indx, __u16 size, pegasus->dr.wLength = cpu_to_le16p(&size); pegasus->ctrl_urb->transfer_buffer_length = size; - FILL_CONTROL_URB(pegasus->ctrl_urb, pegasus->usb, + usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, usb_rcvctrlpipe(pegasus->usb, 0), (char *) &pegasus->dr, buffer, size, ctrl_callback, pegasus); @@ -194,7 +194,7 @@ static int set_registers(pegasus_t * pegasus, __u16 indx, __u16 size, pegasus->dr.wLength = cpu_to_le16p(&size); pegasus->ctrl_urb->transfer_buffer_length = size; - FILL_CONTROL_URB(pegasus->ctrl_urb, pegasus->usb, + usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, usb_sndctrlpipe(pegasus->usb, 0), (char *) &pegasus->dr, buffer, size, ctrl_callback, pegasus); @@ -243,7 +243,7 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data) pegasus->dr.wLength = cpu_to_le16(1); pegasus->ctrl_urb->transfer_buffer_length = 1; - FILL_CONTROL_URB(pegasus->ctrl_urb, pegasus->usb, + usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, usb_sndctrlpipe(pegasus->usb, 0), (char *) &pegasus->dr, buffer, 1, ctrl_callback, pegasus); @@ -275,7 +275,7 @@ static int update_eth_regs_async(pegasus_t * pegasus) pegasus->dr.wLength = cpu_to_le16(3); pegasus->ctrl_urb->transfer_buffer_length = 3; - FILL_CONTROL_URB(pegasus->ctrl_urb, pegasus->usb, + usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, usb_sndctrlpipe(pegasus->usb, 0), (char *) &pegasus->dr, pegasus->eth_regs, 3, ctrl_callback, pegasus); @@ -596,7 +596,7 @@ static void read_bulk_callback(struct urb *urb) if (pegasus->rx_skb == NULL) goto tl_sched; goon: - FILL_BULK_URB(pegasus->rx_urb, pegasus->usb, + usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, usb_rcvbulkpipe(pegasus->usb, 1), pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); @@ -635,7 +635,7 @@ static void rx_fixup(unsigned long data) tasklet_schedule(&pegasus->rx_tl); return; } - FILL_BULK_URB(pegasus->rx_urb, pegasus->usb, + usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, usb_rcvbulkpipe(pegasus->usb, 1), pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); @@ -734,7 +734,7 @@ static int pegasus_start_xmit(struct sk_buff *skb, struct net_device *net) ((__u16 *) pegasus->tx_buff)[0] = cpu_to_le16(l16); memcpy(pegasus->tx_buff + 2, skb->data, skb->len); - FILL_BULK_URB(pegasus->tx_urb, pegasus->usb, + usb_fill_bulk_urb(pegasus->tx_urb, pegasus->usb, usb_sndbulkpipe(pegasus->usb, 2), pegasus->tx_buff, count, write_bulk_callback, pegasus); @@ -852,13 +852,13 @@ static int pegasus_open(struct net_device *net) return -ENOMEM; down(&pegasus->sem); - FILL_BULK_URB(pegasus->rx_urb, pegasus->usb, + usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, usb_rcvbulkpipe(pegasus->usb, 1), pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); if ((res = usb_submit_urb(pegasus->rx_urb, GFP_KERNEL))) warn("%s: failed rx_urb %d", __FUNCTION__, res); - FILL_INT_URB(pegasus->intr_urb, pegasus->usb, + usb_fill_int_urb(pegasus->intr_urb, pegasus->usb, usb_rcvintpipe(pegasus->usb, 3), pegasus->intr_buff, sizeof(pegasus->intr_buff), intr_callback, pegasus, pegasus->intr_interval); diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index 7517394ebb92..7c8b0274a826 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c @@ -174,7 +174,7 @@ static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size, void *data) dev->dr.wIndex = 0; dev->dr.wLength = cpu_to_le16(size); dev->ctrl_urb->transfer_buffer_length = size; - FILL_CONTROL_URB(dev->ctrl_urb, dev->udev, + usb_fill_control_urb(dev->ctrl_urb, dev->udev, usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr, &dev->rx_creg, size, ctrl_callback, dev); if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) @@ -387,7 +387,7 @@ static void read_bulk_callback(struct urb *urb) dev->rx_skb = skb; goon: - FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), + usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { set_bit(RX_URB_FAIL, &dev->flags); @@ -420,7 +420,7 @@ static void rx_fixup(unsigned long data) if (skb == NULL) goto tlsched; dev->rx_skb = skb; - FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), + usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); try_again: if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { @@ -610,7 +610,7 @@ static int rtl8150_start_xmit(struct sk_buff *skb, struct net_device *netdev) count = (skb->len < 60) ? 60 : skb->len; count = (count & 0x3f) ? count : count + 1; dev->tx_skb = skb; - FILL_BULK_URB(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), + usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), skb->data, count, write_bulk_callback, dev); if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) { warn("failed tx_urb %d\n", res); @@ -640,11 +640,11 @@ static int rtl8150_open(struct net_device *netdev) return -ENOMEM; down(&dev->sem); - FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), + usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) warn("%s: rx_urb submit failed: %d", __FUNCTION__, res); - FILL_INT_URB(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), + usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), dev->intr_buff, sizeof(dev->intr_buff), intr_callback, dev, dev->intr_interval); if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index 9c21bc806400..9f9cd6e78d2b 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c @@ -532,7 +532,7 @@ static int genelink_init (struct usbnet *dev) } // fill irq urb - FILL_INT_URB (priv->irq_urb, dev->udev, + usb_fill_int_urb (priv->irq_urb, dev->udev, usb_rcvintpipe (dev->udev, GENELINK_INTERRUPT_PIPE), priv->irq_buf, INTERRUPT_BUFSIZE, gl_interrupt_complete, 0, @@ -1472,7 +1472,7 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags) entry->state = rx_start; entry->length = 0; - FILL_BULK_URB (urb, dev->udev, + usb_fill_bulk_urb (urb, dev->udev, usb_rcvbulkpipe (dev->udev, dev->driver_info->in), skb->data, size, rx_complete, skb); urb->transfer_flags |= USB_ASYNC_UNLINK; @@ -1954,7 +1954,7 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net) if ((length % EP_SIZE (dev)) == 0) skb->len++; - FILL_BULK_URB (urb, dev->udev, + usb_fill_bulk_urb (urb, dev->udev, usb_sndbulkpipe (dev->udev, info->out), skb->data, skb->len, tx_complete, skb); urb->transfer_flags |= USB_ASYNC_UNLINK; diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 5806d3e173b3..75d55155ba15 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c @@ -244,7 +244,7 @@ static int cyberjack_write (struct usb_serial_port *port, int from_user, const u priv->wrsent=length; /* set up our urb */ - FILL_BULK_URB(port->write_urb, serial->dev, + usb_fill_bulk_urb(port->write_urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), port->write_urb->transfer_buffer, length, ((serial->type->write_bulk_callback) ? @@ -422,7 +422,7 @@ static void cyberjack_write_bulk_callback (struct urb *urb) priv->wrsent+=length; /* set up our urb */ - FILL_BULK_URB(port->write_urb, serial->dev, + usb_fill_bulk_urb(port->write_urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), port->write_urb->transfer_buffer, length, ((serial->type->write_bulk_callback) ? diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index ac3f11202cae..f006bab74df0 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c @@ -168,7 +168,7 @@ static int empeg_open (struct usb_serial_port *port, struct file *filp) bytes_out = 0; /* Start reading from the device */ - FILL_BULK_URB( + usb_fill_bulk_urb( port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, @@ -265,7 +265,7 @@ static int empeg_write (struct usb_serial_port *port, int from_user, const unsig } /* build up our urb */ - FILL_BULK_URB ( + usb_fill_bulk_urb ( urb, serial->dev, usb_sndbulkpipe(serial->dev, @@ -413,7 +413,7 @@ static void empeg_read_bulk_callback (struct urb *urb) } /* Continue trying to always read */ - FILL_BULK_URB( + usb_fill_bulk_urb( port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 2df1a6ca0f66..fe4a96240096 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -346,7 +346,7 @@ static int ftdi_sio_open (struct usb_serial_port *port, struct file *filp) } /* Start reading from the device */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, ftdi_sio_read_bulk_callback, port); @@ -449,7 +449,7 @@ static int ftdi_sio_write (struct usb_serial_port *port, int from_user, usb_serial_debug_data (__FILE__, __FUNCTION__, count, first_byte); /* send the data out the bulk port */ - FILL_BULK_URB(port->write_urb, serial->dev, + usb_fill_bulk_urb(port->write_urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), port->write_urb->transfer_buffer, count, ftdi_sio_write_bulk_callback, port); @@ -608,7 +608,7 @@ static void ftdi_sio_read_bulk_callback (struct urb *urb) #endif /* Continue trying to always read */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, ftdi_sio_read_bulk_callback, port); diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index 88d2eae8a915..f777c14abe34 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c @@ -1479,7 +1479,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge } /* fill up the urb with all of our data and submit it */ - FILL_BULK_URB (urb, edge_serial->serial->dev, + usb_fill_bulk_urb (urb, edge_serial->serial->dev, usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint), buffer, count+2, edge_bulk_out_data_callback, edge_port); @@ -2504,7 +2504,7 @@ static int write_cmd_usb (struct edgeport_port *edge_port, unsigned char *buffer CmdUrbs++; dbg("%s - ALLOCATE URB %p (outstanding %d)", __FUNCTION__, urb, CmdUrbs); - FILL_BULK_URB (urb, edge_serial->serial->dev, + usb_fill_bulk_urb (urb, edge_serial->serial->dev, usb_sndbulkpipe(edge_serial->serial->dev, edge_serial->bulk_out_endpoint), buffer, length, edge_bulk_out_cmd_callback, edge_port); diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index cc0beb63d50c..c4a145cb5aa2 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c @@ -200,7 +200,7 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; /* Start reading from the device */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, ipaq_read_bulk_callback, port); @@ -308,7 +308,7 @@ static void ipaq_read_bulk_callback(struct urb *urb) } /* Continue trying to always read */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, ipaq_read_bulk_callback, port); @@ -429,7 +429,7 @@ static void ipaq_write_gather(struct usb_serial_port *port) } count = URBDATA_SIZE - room; - FILL_BULK_URB(port->write_urb, serial->dev, + usb_fill_bulk_urb(port->write_urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), port->write_urb->transfer_buffer, count, ipaq_write_bulk_callback, port); diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 7d2794872c6e..a92675fbc0d6 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -1085,7 +1085,7 @@ static struct urb *keyspan_setup_urb (struct usb_serial *serial, int endpoint, } /* Fill URB using supplied data. */ - FILL_BULK_URB(urb, serial->dev, + usb_fill_bulk_urb(urb, serial->dev, usb_sndbulkpipe(serial->dev, endpoint) | dir, buf, len, callback, ctx); diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 47312691cc43..f97774827372 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -390,7 +390,7 @@ static int klsi_105_open (struct usb_serial_port *port, struct file *filp) /* READ_ON and urb submission */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, @@ -534,7 +534,7 @@ static int klsi_105_write (struct usb_serial_port *port, int from_user, ((__u8 *)urb->transfer_buffer)[1] = (__u8) ((size & 0xFF00)>>8); /* set up our urb */ - FILL_BULK_URB(urb, serial->dev, + usb_fill_bulk_urb(urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), urb->transfer_buffer, @@ -697,7 +697,7 @@ static void klsi_105_read_bulk_callback (struct urb *urb) priv->bytes_in += bytes_sent; } /* Continue trying to always read */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index 0cdb7e44933c..5b7a48de3b2c 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c @@ -450,7 +450,7 @@ static int mct_u232_write (struct usb_serial_port *port, int from_user, } /* set up our urb */ - FILL_BULK_URB(port->write_urb, serial->dev, + usb_fill_bulk_urb(port->write_urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress), port->write_urb->transfer_buffer, size, diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index b4d5fa960435..541bcdbe8f61 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c @@ -172,7 +172,7 @@ static int omninet_open (struct usb_serial_port *port, struct file *filp) wport->tty = port->tty; /* Start reading from the device */ - FILL_BULK_URB(port->read_urb, serial->dev, + usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, omninet_read_bulk_callback, port); @@ -255,7 +255,7 @@ static void omninet_read_bulk_callback (struct urb *urb) } /* Continue trying to always read */ - FILL_BULK_URB(urb, serial->dev, + usb_fill_bulk_urb(urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), urb->transfer_buffer, urb->transfer_buffer_length, omninet_read_bulk_callback, port); diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index 1f64274873de..bea9ceae59cf 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c @@ -270,7 +270,7 @@ static void safe_read_bulk_callback (struct urb *urb) } /* Continue trying to always read */ - FILL_BULK_URB (urb, serial->dev, + usb_fill_bulk_urb (urb, serial->dev, usb_rcvbulkpipe (serial->dev, port->bulk_in_endpointAddress), urb->transfer_buffer, urb->transfer_buffer_length, safe_read_bulk_callback, port); diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 6820bdc91e1b..6910a8f86033 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -474,7 +474,7 @@ int usb_stor_control_msg(struct us_data *us, unsigned int pipe, us->dr->wLength = cpu_to_le16(size); /* fill and submit the URB */ - FILL_CONTROL_URB(us->current_urb, us->pusb_dev, pipe, + usb_fill_control_urb(us->current_urb, us->pusb_dev, pipe, (unsigned char*) us->dr, data, size, usb_stor_blocking_completion, NULL); status = usb_stor_msg_common(us); @@ -494,7 +494,7 @@ int usb_stor_bulk_msg(struct us_data *us, void *data, unsigned int pipe, int status; /* fill and submit the URB */ - FILL_BULK_URB(us->current_urb, us->pusb_dev, pipe, data, len, + usb_fill_bulk_urb(us->current_urb, us->pusb_dev, pipe, data, len, usb_stor_blocking_completion, NULL); status = usb_stor_msg_common(us); diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index a463fe4544aa..b31328917e5c 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -577,7 +577,7 @@ static int usb_stor_allocate_urbs(struct us_data *ss) maxp = sizeof(ss->irqbuf); /* fill in the URB with our data */ - FILL_INT_URB(ss->irq_urb, ss->pusb_dev, pipe, ss->irqbuf, + usb_fill_int_urb(ss->irq_urb, ss->pusb_dev, pipe, ss->irqbuf, maxp, usb_stor_CBI_irq, ss, ss->ep_int->bInterval); /* submit the URB for processing */ diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index bae45783a718..b267c949d957 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c @@ -428,7 +428,7 @@ static ssize_t skel_write (struct file *file, const char *buffer, size_t count, dev->write_urb->transfer_buffer); /* set up our urb */ - FILL_BULK_URB(dev->write_urb, dev->udev, + usb_fill_bulk_urb(dev->write_urb, dev->udev, usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), dev->write_urb->transfer_buffer, bytes_written, skel_write_bulk_callback, dev); @@ -587,7 +587,7 @@ static int skel_probe(struct usb_interface *interface, const struct usb_device_i err("Couldn't allocate bulk_out_buffer"); goto error; } - FILL_BULK_URB(dev->write_urb, udev, + usb_fill_bulk_urb(dev->write_urb, udev, usb_sndbulkpipe(udev, endpoint->bEndpointAddress), dev->bulk_out_buffer, buffer_size, diff --git a/include/linux/usb.h b/include/linux/usb.h index 0397f55aabdc..3ac02a20c490 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -872,17 +872,6 @@ static inline void usb_fill_int_urb (struct urb *urb, urb->start_frame = -1; } -/* - * old style macros to enable 2.4 and 2.2 drivers to build - * properly. Please do not use these for new USB drivers. - */ -#define FILL_CONTROL_URB(URB,DEV,PIPE,SETUP_PACKET,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT) \ - usb_fill_control_urb(URB,DEV,PIPE,SETUP_PACKET,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT) -#define FILL_BULK_URB(URB,DEV,PIPE,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT) \ - usb_fill_bulk_urb(URB,DEV,PIPE,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT) -#define FILL_INT_URB(URB,DEV,PIPE,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT,INTERVAL) \ - usb_fill_int_urb(URB,DEV,PIPE,TRANSFER_BUFFER,BUFFER_LENGTH,COMPLETE,CONTEXT,INTERVAL) - extern struct urb *usb_alloc_urb(int iso_packets, int mem_flags); extern void usb_free_urb(struct urb *urb); #define usb_put_urb usb_free_urb diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index f2f6f2a75a90..d68e7f2b42bb 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c @@ -590,10 +590,10 @@ static int snd_usbmidi_in_endpoint_create(snd_usb_midi_t* umidi, return -ENOMEM; } if (int_epd) - FILL_INT_URB(ep->urb, umidi->chip->dev, pipe, buffer, length, + usb_fill_int_urb(ep->urb, umidi->chip->dev, pipe, buffer, length, snd_usbmidi_in_urb_complete, ep, int_epd->bInterval); else - FILL_BULK_URB(ep->urb, umidi->chip->dev, pipe, buffer, length, + usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer, length, snd_usbmidi_in_urb_complete, ep); rep->in = ep; @@ -657,7 +657,7 @@ static int snd_usbmidi_out_endpoint_create(snd_usb_midi_t* umidi, snd_usbmidi_out_endpoint_delete(ep); return -ENOMEM; } - FILL_BULK_URB(ep->urb, umidi->chip->dev, pipe, buffer, + usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer, ep->max_transfer, snd_usbmidi_out_urb_complete, ep); spin_lock_init(&ep->buffer_lock); -- cgit v1.2.3 From 22f63236fed3424551a63ec115644e2fc82658bc Mon Sep 17 00:00:00 2001 From: Josh Myer Date: Mon, 28 Oct 2002 23:27:28 -0800 Subject: [PATCH] [PATCH] fix a FIXME in usb.h In ush.h, there's a FIXME for the URB transfer flags. This patch is basically a global search and replace to change those all from USB_ to URB_. It touches a few things that aren't directly USB-related, and so should probably be passed by those authors, but I figured i should put it here to get feedback (ie: "No, moron, you did it all wrong!" or "Oops, that FIXME wasn't supposed to be there") before bothering them. --- Documentation/usb/URB.txt | 4 ++-- drivers/bluetooth/hci_usb.c | 6 +++--- drivers/isdn/hisax/st5481_d.c | 4 ++-- drivers/isdn/hisax/st5481_usb.c | 2 +- drivers/media/video/cpia_usb.c | 4 ++-- drivers/net/irda/irda-usb.c | 20 ++++++++++---------- drivers/usb/class/audio.c | 16 ++++++++-------- drivers/usb/class/cdc-acm.c | 4 ++-- drivers/usb/core/devio.c | 2 +- drivers/usb/core/hcd.c | 6 +++--- drivers/usb/core/message.c | 2 +- drivers/usb/core/urb.c | 12 ++++++------ drivers/usb/host/ehci-q.c | 2 +- drivers/usb/host/ehci-sched.c | 2 +- drivers/usb/host/hc_simple.c | 10 +++++----- drivers/usb/host/hc_sl811_rh.c | 2 +- drivers/usb/host/ohci-hcd.c | 6 +++--- drivers/usb/host/ohci-q.c | 2 +- drivers/usb/host/uhci-hcd.c | 12 ++++++------ drivers/usb/media/dabusb.c | 2 +- drivers/usb/media/konicawc.c | 4 ++-- drivers/usb/media/ov511.c | 2 +- drivers/usb/media/pwc-if.c | 2 +- drivers/usb/media/usbvideo.c | 2 +- drivers/usb/misc/auerswald.c | 4 ++-- drivers/usb/net/catc.c | 4 ++-- drivers/usb/net/cdc-ether.c | 2 +- drivers/usb/net/kaweth.c | 2 +- drivers/usb/net/pegasus.c | 2 +- drivers/usb/net/rtl8150.c | 2 +- drivers/usb/net/usbnet.c | 4 ++-- drivers/usb/serial/ir-usb.c | 4 ++-- drivers/usb/serial/keyspan.c | 8 ++++---- drivers/usb/storage/transport.c | 4 ++-- include/linux/usb.h | 18 ++++++++---------- sound/usb/usbaudio.c | 6 +++--- 36 files changed, 94 insertions(+), 96 deletions(-) (limited to 'include/linux') diff --git a/Documentation/usb/URB.txt b/Documentation/usb/URB.txt index 5df880cb3ce3..d25d24614e36 100644 --- a/Documentation/usb/URB.txt +++ b/Documentation/usb/URB.txt @@ -109,7 +109,7 @@ Take a look at the some existing drivers to see how they're used. Flags: For ISO there are two startup behaviors: Specified start_frame or ASAP. -For ASAP set USB_ISO_ASAP in transfer_flags. +For ASAP set URB_ISO_ASAP in transfer_flags. If short packets should NOT be tolerated, set URB_SHORT_NOT_OK in transfer_flags. @@ -156,7 +156,7 @@ usb_unlink_urb() returns with that status code, you can free the URB with usb_free_urb(). There is also an asynchronous unlink mode. To use this, set the -the USB_ASYNC_UNLINK flag in urb->transfer flags before calling +the URB_ASYNC_UNLINK flag in urb->transfer flags before calling usb_unlink_urb(). When using async unlinking, the URB will not normally be unlinked when usb_unlink_urb() returns. Instead, wait for the completion handler to be called. diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index 708a1b75d18e..f714bf978daa 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c @@ -67,8 +67,8 @@ #endif #ifndef CONFIG_BT_USB_ZERO_PACKET -#undef USB_ZERO_PACKET -#define USB_ZERO_PACKET 0 +#undef URB_ZERO_PACKET +#define URB_ZERO_PACKET 0 #endif static struct usb_driver hci_usb_driver; @@ -330,7 +330,7 @@ static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb) usb_fill_bulk_urb(urb, husb->udev, pipe, skb->data, skb->len, hci_usb_tx_complete, skb); - urb->transfer_flags = USB_ZERO_PACKET; + urb->transfer_flags = URB_ZERO_PACKET; BT_DBG("%s urb %p len %d", husb->hdev.name, urb, skb->len); diff --git a/drivers/isdn/hisax/st5481_d.c b/drivers/isdn/hisax/st5481_d.c index 17f670d864ee..01ee4f3b102c 100644 --- a/drivers/isdn/hisax/st5481_d.c +++ b/drivers/isdn/hisax/st5481_d.c @@ -358,7 +358,7 @@ static void usb_d_out(struct st5481_adapter *adapter, int buf_nr) if (usb_submit_urb(urb, GFP_KERNEL) < 0) { // There is another URB queued up - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; SUBMIT_URB(urb, GFP_KERNEL); } } @@ -447,7 +447,7 @@ static void dout_start_xmit(struct FsmInst *fsm, int event, void *arg) // Prepare the URB urb->dev = adapter->usb_dev; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; DBG_ISO_PACKET(0x20,urb); SUBMIT_URB(urb, GFP_KERNEL); diff --git a/drivers/isdn/hisax/st5481_usb.c b/drivers/isdn/hisax/st5481_usb.c index 76536eb5d75e..89bb2f66c60e 100644 --- a/drivers/isdn/hisax/st5481_usb.c +++ b/drivers/isdn/hisax/st5481_usb.c @@ -409,7 +409,7 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, urb->actual_length = 0; urb->complete=complete; urb->context=context; - urb->transfer_flags=USB_ISO_ASAP; + urb->transfer_flags=URB_ISO_ASAP; for (k = 0; k < num_packets; k++) { urb->iso_frame_desc[k].offset = packet_size * k; urb->iso_frame_desc[k].length = packet_size; diff --git a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c index 3a68e91717de..d49f8d0fe742 100644 --- a/drivers/media/video/cpia_usb.c +++ b/drivers/media/video/cpia_usb.c @@ -220,7 +220,7 @@ static int cpia_usb_open(void *privdata) urb->dev = ucpia->dev; urb->context = ucpia; urb->pipe = usb_rcvisocpipe(ucpia->dev, 1); - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = ucpia->sbuf[0].data; urb->complete = cpia_usb_complete; urb->number_of_packets = FRAMES_PER_DESC; @@ -242,7 +242,7 @@ static int cpia_usb_open(void *privdata) urb->dev = ucpia->dev; urb->context = ucpia; urb->pipe = usb_rcvisocpipe(ucpia->dev, 1); - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = ucpia->sbuf[1].data; urb->complete = cpia_usb_complete; urb->number_of_packets = FRAMES_PER_DESC; diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index a88314c7a459..6566f8d116fb 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c @@ -41,7 +41,7 @@ * This driver has NOT been tested with the following drivers : * o ehci-hcd (USB 2.0 controllers) * - * Note that all HCD drivers do USB_ZERO_PACKET and timeout properly, + * Note that all HCD drivers do URB_ZERO_PACKET and timeout properly, * so we don't have to worry about that anymore. * One common problem is the failure to set the address on the dongle, * but this happens before the driver gets loaded... @@ -270,7 +270,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self) frame, IRDA_USB_SPEED_MTU, speed_bulk_callback, self); urb->transfer_buffer_length = USB_IRDA_HEADER; - urb->transfer_flags = USB_ASYNC_UNLINK; + urb->transfer_flags = URB_ASYNC_UNLINK; urb->timeout = MSECS_TO_JIFFIES(100); /* Irq disabled -> GFP_ATOMIC */ @@ -407,13 +407,13 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) urb->transfer_buffer_length = skb->len; /* Note : unlink *must* be Asynchronous because of the code in * irda_usb_net_timeout() -> call in irq - Jean II */ - urb->transfer_flags = USB_ASYNC_UNLINK; - /* This flag (USB_ZERO_PACKET) indicates that what we send is not + urb->transfer_flags = URB_ASYNC_UNLINK; + /* This flag (URB_ZERO_PACKET) indicates that what we send is not * a continuous stream of data but separate packets. * In this case, the USB layer will insert an empty USB frame (TD) * after each of our packets that is exact multiple of the frame size. * This is how the dongle will detect the end of packet - Jean II */ - urb->transfer_flags |= USB_ZERO_PACKET; + urb->transfer_flags |= URB_ZERO_PACKET; /* Timeout need to be shorter than NET watchdog timer */ urb->timeout = MSECS_TO_JIFFIES(200); @@ -634,7 +634,7 @@ static void irda_usb_net_timeout(struct net_device *netdev) * be -ENOENT. We will fix that at the next watchdog, * leaving more time to USB to recover... * Also, we are in interrupt, so we need to have - * USB_ASYNC_UNLINK to work properly... + * URB_ASYNC_UNLINK to work properly... * Jean II */ done = 1; break; @@ -1016,9 +1016,9 @@ static int irda_usb_net_close(struct net_device *netdev) } } /* Cancel Tx and speed URB - need to be synchronous to avoid races */ - self->tx_urb->transfer_flags &= ~USB_ASYNC_UNLINK; + self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK; usb_unlink_urb(self->tx_urb); - self->speed_urb->transfer_flags &= ~USB_ASYNC_UNLINK; + self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK; usb_unlink_urb(self->speed_urb); /* Stop and remove instance of IrLAP */ @@ -1573,9 +1573,9 @@ static void irda_usb_disconnect(struct usb_interface *intf) usb_unlink_urb(self->rx_urb[i]); /* Cancel Tx and speed URB. * Toggle flags to make sure it's synchronous. */ - self->tx_urb->transfer_flags &= ~USB_ASYNC_UNLINK; + self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK; usb_unlink_urb(self->tx_urb); - self->speed_urb->transfer_flags &= ~USB_ASYNC_UNLINK; + self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK; usb_unlink_urb(self->speed_urb); } diff --git a/drivers/usb/class/audio.c b/drivers/usb/class/audio.c index 41b049b9bd10..3287d9a3d7bb 100644 --- a/drivers/usb/class/audio.c +++ b/drivers/usb/class/audio.c @@ -1049,7 +1049,7 @@ static int usbin_start(struct usb_audiodev *as) urb = u->durb[0].urb; urb->dev = dev; urb->pipe = u->datapipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = DESCFRAMES; urb->context = as; urb->complete = usbin_completed; @@ -1062,7 +1062,7 @@ static int usbin_start(struct usb_audiodev *as) urb = u->durb[1].urb; urb->dev = dev; urb->pipe = u->datapipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = DESCFRAMES; urb->context = as; urb->complete = usbin_completed; @@ -1076,7 +1076,7 @@ static int usbin_start(struct usb_audiodev *as) urb = u->surb[0].urb; urb->dev = dev; urb->pipe = u->syncpipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = SYNCFRAMES; urb->context = as; urb->complete = usbin_sync_completed; @@ -1090,7 +1090,7 @@ static int usbin_start(struct usb_audiodev *as) urb = u->surb[1].urb; urb->dev = dev; urb->pipe = u->syncpipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = SYNCFRAMES; urb->context = as; urb->complete = usbin_sync_completed; @@ -1416,7 +1416,7 @@ static int usbout_start(struct usb_audiodev *as) urb = u->durb[0].urb; urb->dev = dev; urb->pipe = u->datapipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = DESCFRAMES; urb->context = as; urb->complete = usbout_completed; @@ -1429,7 +1429,7 @@ static int usbout_start(struct usb_audiodev *as) urb = u->durb[1].urb; urb->dev = dev; urb->pipe = u->datapipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = DESCFRAMES; urb->context = as; urb->complete = usbout_completed; @@ -1443,7 +1443,7 @@ static int usbout_start(struct usb_audiodev *as) urb = u->surb[0].urb; urb->dev = dev; urb->pipe = u->syncpipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = SYNCFRAMES; urb->context = as; urb->complete = usbout_sync_completed; @@ -1457,7 +1457,7 @@ static int usbout_start(struct usb_audiodev *as) urb = u->surb[1].urb; urb->dev = dev; urb->pipe = u->syncpipe; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->number_of_packets = SYNCFRAMES; urb->context = as; urb->complete = usbout_sync_completed; diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index bdc28ce6e3a4..2fbef5d86af6 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -630,11 +630,11 @@ static int acm_probe (struct usb_interface *intf, usb_fill_bulk_urb(acm->readurb, dev, usb_rcvbulkpipe(dev, epread->bEndpointAddress), buf += ctrlsize, readsize, acm_read_bulk, acm); - acm->readurb->transfer_flags |= USB_NO_FSBR; + acm->readurb->transfer_flags |= URB_NO_FSBR; usb_fill_bulk_urb(acm->writeurb, dev, usb_sndbulkpipe(dev, epwrite->bEndpointAddress), buf += readsize, acm->writesize, acm_write_bulk, acm); - acm->writeurb->transfer_flags |= USB_NO_FSBR; + acm->writeurb->transfer_flags |= URB_NO_FSBR; info("ttyACM%d: USB ACM device", minor); diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 22596da570cd..0c1bc5b47ea1 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -755,7 +755,7 @@ static int proc_submiturb(struct dev_state *ps, void *arg) if (copy_from_user(&uurb, arg, sizeof(uurb))) return -EFAULT; if (uurb.flags & ~(USBDEVFS_URB_ISO_ASAP|USBDEVFS_URB_SHORT_NOT_OK| - USB_NO_FSBR|USB_ZERO_PACKET)) + URB_NO_FSBR|URB_ZERO_PACKET)) return -EINVAL; if (!uurb.buffer) return -EINVAL; diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 4d48c311f1b0..414029971cba 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1110,7 +1110,7 @@ static int hcd_unlink_urb (struct urb *urb) */ spin_lock_irqsave (&urb->lock, flags); spin_lock (&hcd_data_lock); - if (!urb->hcpriv || urb->transfer_flags & USB_TIMEOUT_KILLED) { + if (!urb->hcpriv || urb->transfer_flags & URB_TIMEOUT_KILLED) { retval = -EINVAL; goto done; } @@ -1182,13 +1182,13 @@ if (retval && urb->status == -ENOENT) err ("whoa! retval %d", retval); } /* block till giveback, if needed */ - if (!(urb->transfer_flags & (USB_ASYNC_UNLINK|USB_TIMEOUT_KILLED)) + if (!(urb->transfer_flags & (URB_ASYNC_UNLINK|URB_TIMEOUT_KILLED)) && HCD_IS_RUNNING (hcd->state) && !retval) { dbg ("%s: wait for giveback urb %p", hcd->self.bus_name, urb); wait_for_completion (&splice.done); - } else if ((urb->transfer_flags & USB_ASYNC_UNLINK) && retval == 0) { + } else if ((urb->transfer_flags & URB_ASYNC_UNLINK) && retval == 0) { return -EINPROGRESS; } goto bye; diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 021cd1ff7d3a..cf5967746f7d 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -324,7 +324,7 @@ int usb_sg_init ( if (!io->urbs) goto nomem; - urb_flags = USB_ASYNC_UNLINK | URB_NO_DMA_MAP | URB_NO_INTERRUPT; + urb_flags = URB_ASYNC_UNLINK | URB_NO_DMA_MAP | URB_NO_INTERRUPT; if (usb_pipein (pipe)) urb_flags |= URB_SHORT_NOT_OK; diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 929fc66270ff..dd125b117124 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c @@ -272,23 +272,23 @@ int usb_submit_urb(struct urb *urb, int mem_flags) unsigned int allowed; /* enforce simple/standard policy */ - allowed = USB_ASYNC_UNLINK; // affects later unlinks + allowed = URB_ASYNC_UNLINK; // affects later unlinks allowed |= URB_NO_DMA_MAP; allowed |= URB_NO_INTERRUPT; switch (temp) { case PIPE_BULK: if (is_out) - allowed |= USB_ZERO_PACKET; + allowed |= URB_ZERO_PACKET; /* FALLTHROUGH */ case PIPE_CONTROL: - allowed |= USB_NO_FSBR; /* only affects UHCI */ + allowed |= URB_NO_FSBR; /* only affects UHCI */ /* FALLTHROUGH */ default: /* all non-iso endpoints */ if (!is_out) allowed |= URB_SHORT_NOT_OK; break; case PIPE_ISOCHRONOUS: - allowed |= USB_ISO_ASAP; + allowed |= URB_ISO_ASAP; break; } urb->transfer_flags &= allowed; @@ -360,7 +360,7 @@ int usb_submit_urb(struct urb *urb, int mem_flags) * that the request has been canceled, and that control of the URB * has been returned to that device driver. * - * When the USB_ASYNC_UNLINK transfer flag for the URB is clear, this + * When the URB_ASYNC_UNLINK transfer flag for the URB is clear, this * request is synchronous. Success is indicated by returning zero, * at which time the urb will have been unlinked, * and the completion function will see status -ENOENT. Failure is @@ -368,7 +368,7 @@ int usb_submit_urb(struct urb *urb, int mem_flags) * when unlinking an urb from an interrupt context, such as a bottom * half or a completion handler, * - * When the USB_ASYNC_UNLINK transfer flag for the URB is set, this + * When the URB_ASYNC_UNLINK transfer flag for the URB is set, this * request is asynchronous. Success is indicated by returning -EINPROGRESS, * at which time the urb will normally not have been unlinked, * and the completion function will see status -ECONNRESET. Failure is diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 514b628c68f9..6f0d36dd2cae 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -463,7 +463,7 @@ qh_urb_transaction ( token ^= 0x0100; /* "in" <--> "out" */ token |= QTD_TOGGLE; /* force DATA1 */ } else if (usb_pipebulk (urb->pipe) - && (urb->transfer_flags & USB_ZERO_PACKET) + && (urb->transfer_flags & URB_ZERO_PACKET) && !(urb->transfer_buffer_length % maxpacket)) { one_more = 1; } diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index d1d6346fe54f..62abde4c9908 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -738,7 +738,7 @@ static int get_iso_range ( } /* explicit start frame? */ - if (!(urb->transfer_flags & USB_ISO_ASAP)) { + if (!(urb->transfer_flags & URB_ISO_ASAP)) { unsigned temp; /* sanity check: must be in range */ diff --git a/drivers/usb/host/hc_simple.c b/drivers/usb/host/hc_simple.c index 570267835101..ce06daad48b8 100644 --- a/drivers/usb/host/hc_simple.c +++ b/drivers/usb/host/hc_simple.c @@ -219,7 +219,7 @@ static int hci_unlink_urb (struct urb * urb) if (!list_empty (&urb->urb_list) && urb->status == -EINPROGRESS) { /* URB active? */ - if (urb->transfer_flags & (USB_ASYNC_UNLINK | USB_TIMEOUT_KILLED)) { + if (urb->transfer_flags & (URB_ASYNC_UNLINK | URB_TIMEOUT_KILLED)) { /* asynchronous with callback */ /* relink the urb to the del list */ list_move (&urb->urb_list, &hci->del_list); @@ -251,7 +251,7 @@ static int hci_unlink_urb (struct urb * urb) /* hcd does not own URB but we keep the driver happy anyway */ spin_unlock_irqrestore (&usb_urb_lock, flags); - if (urb->complete && (urb->transfer_flags & USB_ASYNC_UNLINK)) { + if (urb->complete && (urb->transfer_flags & URB_ASYNC_UNLINK)) { urb->status = -ENOENT; urb->actual_length = 0; urb->complete (urb); @@ -388,7 +388,7 @@ static void qu_urb_timeout (unsigned long lurb) struct urb *urb = (struct urb *) lurb; DBGFUNC ("enter qu_urb_timeout\n"); - urb->transfer_flags |= USB_TIMEOUT_KILLED; + urb->transfer_flags |= URB_TIMEOUT_KILLED; hci_unlink_urb (urb); } #endif @@ -472,7 +472,7 @@ static inline void qu_queue_active_urb (hci_t * hci, struct urb * urb, epd_t * e case PIPE_BULK: list_add (&urb->urb_list, &hci->bulk_list); - if ((urb->transfer_flags & USB_ZERO_PACKET) + if ((urb->transfer_flags & URB_ZERO_PACKET) && urb->transfer_buffer_length > 0 && ((urb->transfer_buffer_length % @@ -523,7 +523,7 @@ static int qu_queue_urb (hci_t * hci, struct urb * urb) /* for ISOC transfers calculate start frame index */ - if (usb_pipeisoc (urb->pipe) && urb->transfer_flags & USB_ISO_ASAP) { + if (usb_pipeisoc (urb->pipe) && urb->transfer_flags & URB_ISO_ASAP) { urb->start_frame = ((ed->pipe_head) ? (ed->last_iso + 1) : hci_get_current_frame_number (urb-> dev) + 1) & 0xffff; } diff --git a/drivers/usb/host/hc_sl811_rh.c b/drivers/usb/host/hc_sl811_rh.c index e2ce511ebdb6..da6d30214359 100644 --- a/drivers/usb/host/hc_sl811_rh.c +++ b/drivers/usb/host/hc_sl811_rh.c @@ -534,7 +534,7 @@ static int rh_unlink_urb (struct urb * urb) urb->hcpriv = NULL; usb_put_dev (urb->dev); urb->dev = NULL; - if (urb->transfer_flags & USB_ASYNC_UNLINK) { + if (urb->transfer_flags & URB_ASYNC_UNLINK) { urb->status = -ECONNRESET; if (urb->complete) { urb->complete (urb); diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index f3e21ed3ad80..c86ecea5fdc6 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -29,7 +29,7 @@ * * 2001/10/18 merge pmac cleanup (Benjamin Herrenschmidt) and bugfixes * from post-2.4.5 patches. - * 2001/09/20 USB_ZERO_PACKET support; hcca_dma portability, OPTi warning + * 2001/09/20 URB_ZERO_PACKET support; hcca_dma portability, OPTi warning * 2001/09/07 match PCI PM changes, errnos from Linus' tree * 2001/05/05 fork 2.4.5 version into "hcd" framework, cleanup, simplify; * pbook pci quirks gone (please fix pbook pci sw!) (db) @@ -185,7 +185,7 @@ static int ohci_urb_enqueue ( /* ... and maybe a zero length packet to wrap it up */ if (size == 0) size++; - else if ((urb->transfer_flags & USB_ZERO_PACKET) != 0 + else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0 && (urb->transfer_buffer_length % usb_maxpacket (urb->dev, pipe, usb_pipeout (pipe))) == 0) @@ -239,7 +239,7 @@ static int ohci_urb_enqueue ( frame |= ed->branch; urb->start_frame = frame; - /* yes, only USB_ISO_ASAP is supported, and + /* yes, only URB_ISO_ASAP is supported, and * urb->start_frame is never used as input. */ } diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index 46b056c879fb..0fac456f47d1 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c @@ -575,7 +575,7 @@ static void td_submit_urb ( info |= TD_R; td_fill (info, data, data_len, urb, cnt); cnt++; - if ((urb->transfer_flags & USB_ZERO_PACKET) + if ((urb->transfer_flags & URB_ZERO_PACKET) && cnt < urb_priv->length) { td_fill (info, 0, 0, urb, cnt); cnt++; diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index f23a9cf91a9e..c5d574ea947c 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -739,7 +739,7 @@ static void uhci_inc_fsbr(struct uhci_hcd *uhci, struct urb *urb) spin_lock_irqsave(&uhci->frame_list_lock, flags); - if ((!(urb->transfer_flags & USB_NO_FSBR)) && !urbp->fsbr) { + if ((!(urb->transfer_flags & URB_NO_FSBR)) && !urbp->fsbr) { urbp->fsbr = 1; if (!uhci->fsbr++ && !uhci->fsbrtimeout) uhci->skel_term_qh->link = cpu_to_le32(uhci->skel_hs_control_qh->dma_handle) | UHCI_PTR_QH; @@ -755,7 +755,7 @@ static void uhci_dec_fsbr(struct uhci_hcd *uhci, struct urb *urb) spin_lock_irqsave(&uhci->frame_list_lock, flags); - if ((!(urb->transfer_flags & USB_NO_FSBR)) && urbp->fsbr) { + if ((!(urb->transfer_flags & URB_NO_FSBR)) && urbp->fsbr) { urbp->fsbr = 0; if (!--uhci->fsbr) uhci->fsbrtimeout = jiffies + FSBR_DELAY; @@ -1124,13 +1124,13 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, struct urb } while (len > 0); /* - * USB_ZERO_PACKET means adding a 0-length packet, if direction + * URB_ZERO_PACKET means adding a 0-length packet, if direction * is OUT and the transfer_length was an exact multiple of maxsze, * hence (len = transfer_length - N * maxsze) == 0 * however, if transfer_length == 0, the zero packet was already * prepared above. */ - if (usb_pipeout(urb->pipe) && (urb->transfer_flags & USB_ZERO_PACKET) && + if (usb_pipeout(urb->pipe) && (urb->transfer_flags & URB_ZERO_PACKET) && !len && urb->transfer_buffer_length) { td = uhci_alloc_td(uhci, urb->dev); if (!td) @@ -1306,7 +1306,7 @@ static int isochronous_find_start(struct uhci_hcd *uhci, struct urb *urb) limits = isochronous_find_limits(uhci, urb, &start, &end); - if (urb->transfer_flags & USB_ISO_ASAP) { + if (urb->transfer_flags & URB_ISO_ASAP) { if (limits) { int curframe; @@ -1752,7 +1752,7 @@ static void stall_callback(unsigned long ptr) tmp = tmp->next; - u->transfer_flags |= USB_TIMEOUT_KILLED; + u->transfer_flags |= URB_TIMEOUT_KILLED; uhci_urb_dequeue(hcd, u); } diff --git a/drivers/usb/media/dabusb.c b/drivers/usb/media/dabusb.c index eaa447b2cfaf..1f241ebddf12 100644 --- a/drivers/usb/media/dabusb.c +++ b/drivers/usb/media/dabusb.c @@ -251,7 +251,7 @@ static int dabusb_alloc_buffers (pdabusb_t s) b->purb->context = b; b->purb->dev = s->usbdev; b->purb->pipe = pipe; - b->purb->transfer_flags = USB_ISO_ASAP; + b->purb->transfer_flags = URB_ISO_ASAP; for (i = 0; i < packets; i++) { b->purb->iso_frame_desc[i].offset = i * pipesize; diff --git a/drivers/usb/media/konicawc.c b/drivers/usb/media/konicawc.c index 89825b4ff9f7..429be7f94526 100644 --- a/drivers/usb/media/konicawc.c +++ b/drivers/usb/media/konicawc.c @@ -408,7 +408,7 @@ static int konicawc_start_data(struct uvd *uvd) urb->context = uvd; urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp); urb->interval = 1; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = uvd->sbuf[i].data; urb->complete = konicawc_isoc_irq; urb->number_of_packets = FRAMES_PER_DESC; @@ -423,7 +423,7 @@ static int konicawc_start_data(struct uvd *uvd) urb->context = uvd; urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1); urb->interval = 1; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = cam->sts_buf[i]; urb->complete = konicawc_isoc_irq; urb->number_of_packets = FRAMES_PER_DESC; diff --git a/drivers/usb/media/ov511.c b/drivers/usb/media/ov511.c index f968afc3d5c6..d74828011b6f 100644 --- a/drivers/usb/media/ov511.c +++ b/drivers/usb/media/ov511.c @@ -3949,7 +3949,7 @@ ov51x_init_isoc(struct usb_ov511 *ov) urb->dev = ov->dev; urb->context = &ov->sbuf[n]; urb->pipe = usb_rcvisocpipe(ov->dev, OV511_ENDPOINT_ADDRESS); - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = ov->sbuf[n].data; urb->complete = ov51x_isoc_irq; urb->number_of_packets = FRAMES_PER_DESC; diff --git a/drivers/usb/media/pwc-if.c b/drivers/usb/media/pwc-if.c index 3f871469997e..d493fe673abe 100644 --- a/drivers/usb/media/pwc-if.c +++ b/drivers/usb/media/pwc-if.c @@ -821,7 +821,7 @@ static int pwc_isoc_init(struct pwc_device *pdev) urb->interval = 1; // devik urb->dev = udev; urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint); - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = pdev->sbuf[i].data; urb->transfer_buffer_length = ISO_BUFFER_SIZE; urb->complete = pwc_isoc_handler; diff --git a/drivers/usb/media/usbvideo.c b/drivers/usb/media/usbvideo.c index 4f5061d1a657..9aeffc958b04 100644 --- a/drivers/usb/media/usbvideo.c +++ b/drivers/usb/media/usbvideo.c @@ -1914,7 +1914,7 @@ static int usbvideo_StartDataPump(struct uvd *uvd) urb->context = uvd; urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp); urb->interval = 1; - urb->transfer_flags = USB_ISO_ASAP; + urb->transfer_flags = URB_ISO_ASAP; urb->transfer_buffer = uvd->sbuf[i].data; urb->complete = usbvideo_IsocIrq; urb->number_of_packets = FRAMES_PER_DESC; diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index 23a1b8cb4d4e..a4738366cb59 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c @@ -445,7 +445,7 @@ static int auerchain_submit_urb (pauerchain_t acp, struct urb * urb) /* cancel an urb which is submitted to the chain the result is 0 if the urb is cancelled, or -EINPROGRESS if - USB_ASYNC_UNLINK is set and the function is successfully started. + URB_ASYNC_UNLINK is set and the function is successfully started. */ static int auerchain_unlink_urb (pauerchain_t acp, struct urb * urb) { @@ -534,7 +534,7 @@ static void auerchain_unlink_all (pauerchain_t acp) acep = acp->active; if (acep) { urbp = acep->urbp; - urbp->transfer_flags &= ~USB_ASYNC_UNLINK; + urbp->transfer_flags &= ~URB_ASYNC_UNLINK; dbg ("unlink active urb"); usb_unlink_urb (urbp); } diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c index 3a50bdd7b03a..b1a4031ef177 100644 --- a/drivers/usb/net/catc.c +++ b/drivers/usb/net/catc.c @@ -381,7 +381,7 @@ static void catc_tx_done(struct urb *urb) if (urb->status == -ECONNRESET) { dbg("Tx Reset."); - urb->transfer_flags &= ~USB_ASYNC_UNLINK; + urb->transfer_flags &= ~URB_ASYNC_UNLINK; urb->status = 0; catc->netdev->trans_start = jiffies; catc->stats.tx_errors++; @@ -443,7 +443,7 @@ static void catc_tx_timeout(struct net_device *netdev) struct catc *catc = netdev->priv; warn("Transmit timed out."); - catc->tx_urb->transfer_flags |= USB_ASYNC_UNLINK; + catc->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; usb_unlink_urb(catc->tx_urb); } diff --git a/drivers/usb/net/cdc-ether.c b/drivers/usb/net/cdc-ether.c index c370ea0b75b5..592852aced36 100644 --- a/drivers/usb/net/cdc-ether.c +++ b/drivers/usb/net/cdc-ether.c @@ -259,7 +259,7 @@ static void CDCEther_tx_timeout( struct net_device *net ) warn("%s: Tx timed out.", net->name); // Tear the waiting frame off the list - ether_dev->tx_urb->transfer_flags |= USB_ASYNC_UNLINK; + ether_dev->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; usb_unlink_urb( ether_dev->tx_urb ); // Update statistics diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c index 16852bf313db..9cd6be09334e 100644 --- a/drivers/usb/net/kaweth.c +++ b/drivers/usb/net/kaweth.c @@ -760,7 +760,7 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) kaweth_usb_transmit_complete, kaweth); kaweth->end = 0; - kaweth->tx_urb->transfer_flags |= USB_ASYNC_UNLINK; + kaweth->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; if((res = usb_submit_urb(kaweth->tx_urb, GFP_ATOMIC))) { diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index c90c771a9bc8..50ec09031196 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c @@ -718,7 +718,7 @@ static void pegasus_tx_timeout(struct net_device *net) return; warn("%s: Tx timed out.", net->name); - pegasus->tx_urb->transfer_flags |= USB_ASYNC_UNLINK; + pegasus->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; usb_unlink_urb(pegasus->tx_urb); pegasus->stats.tx_errors++; } diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index 7c8b0274a826..f2bfc2b729b0 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c @@ -573,7 +573,7 @@ static void rtl8150_tx_timeout(struct net_device *netdev) if (!dev) return; warn("%s: Tx timeout.", netdev->name); - dev->tx_urb->transfer_flags |= USB_ASYNC_UNLINK; + dev->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; usb_unlink_urb(dev->tx_urb); dev->stats.tx_errors++; } diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index 9f9cd6e78d2b..025ba808324d 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c @@ -1475,11 +1475,11 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags) usb_fill_bulk_urb (urb, dev->udev, usb_rcvbulkpipe (dev->udev, dev->driver_info->in), skb->data, size, rx_complete, skb); - urb->transfer_flags |= USB_ASYNC_UNLINK; + urb->transfer_flags |= URB_ASYNC_UNLINK; #if 0 // Idle-but-posted reads with UHCI really chew up // PCI bandwidth unless FSBR is disabled - urb->transfer_flags |= USB_NO_FSBR; + urb->transfer_flags |= URB_NO_FSBR; #endif spin_lock_irqsave (&dev->rxq.lock, lockflags); diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 307b62a32652..e11b418d6474 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c @@ -395,7 +395,7 @@ static int ir_write (struct usb_serial_port *port, int from_user, const unsigned ir_write_bulk_callback, port); - port->write_urb->transfer_flags = USB_ZERO_PACKET; + port->write_urb->transfer_flags = URB_ZERO_PACKET; result = usb_submit_urb (port->write_urb, GFP_ATOMIC); if (result) @@ -597,7 +597,7 @@ static void ir_set_termios (struct usb_serial_port *port, struct termios *old_te ir_write_bulk_callback, port); - port->write_urb->transfer_flags = USB_ZERO_PACKET; + port->write_urb->transfer_flags = URB_ZERO_PACKET; result = usb_submit_urb (port->write_urb, GFP_KERNEL); if (result) diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index a92675fbc0d6..5afe854714ec 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -344,11 +344,11 @@ static int keyspan_write(struct usb_serial_port *port, int from_user, dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip); if (this_urb->status == -EINPROGRESS) { - if (this_urb->transfer_flags & USB_ASYNC_UNLINK) + if (this_urb->transfer_flags & URB_ASYNC_UNLINK) break; if (jiffies - p_priv->tx_start_time[flip] < 10 * HZ) break; - this_urb->transfer_flags |= USB_ASYNC_UNLINK; + this_urb->transfer_flags |= URB_ASYNC_UNLINK; usb_unlink_urb(this_urb); break; } @@ -368,7 +368,7 @@ static int keyspan_write(struct usb_serial_port *port, int from_user, /* send the data out the bulk port */ this_urb->transfer_buffer_length = todo + 1; - this_urb->transfer_flags &= ~USB_ASYNC_UNLINK; + this_urb->transfer_flags &= ~URB_ASYNC_UNLINK; this_urb->dev = port->serial->dev; if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { dbg("usb_submit_urb(write bulk) failed (%d)", err); @@ -912,7 +912,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp) static inline void stop_urb(struct urb *urb) { if (urb && urb->status == -EINPROGRESS) { - urb->transfer_flags &= ~USB_ASYNC_UNLINK; + urb->transfer_flags &= ~URB_ASYNC_UNLINK; usb_unlink_urb(urb); } } diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 6910a8f86033..b216f61e7919 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -381,7 +381,7 @@ unsigned int usb_stor_transfer_length(Scsi_Cmnd *srb) * before the submission or before setting the CAN_CANCEL bit. If so, it's * essential to abort the URB if it hasn't been cancelled already (i.e., * if the CAN_CANCEL bit is still set). Either way, the function must then - * wait for the URB to finish. Note that because the USB_ASYNC_UNLINK flag + * wait for the URB to finish. Note that because the URB_ASYNC_UNLINK flag * is set, the URB can still be in progress even after a call to * usb_unlink_urb() returns. * @@ -426,7 +426,7 @@ static int usb_stor_msg_common(struct us_data *us) us->current_urb->context = &urb_done; us->current_urb->actual_length = 0; us->current_urb->error_count = 0; - us->current_urb->transfer_flags = USB_ASYNC_UNLINK; + us->current_urb->transfer_flags = URB_ASYNC_UNLINK; /* submit the URB */ status = usb_submit_urb(us->current_urb, GFP_NOIO); diff --git a/include/linux/usb.h b/include/linux/usb.h index 3ac02a20c490..1d9873868a90 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -560,17 +560,15 @@ extern int usb_disabled(void); /* * urb->transfer_flags: - * - * FIXME should _all_ be URB_* flags */ #define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ -#define USB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */ +#define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */ #define URB_NO_DMA_MAP 0x0004 /* urb->*_dma are valid on submit */ -#define USB_ASYNC_UNLINK 0x0008 /* usb_unlink_urb() returns asap */ -#define USB_NO_FSBR 0x0020 /* UHCI-specific */ -#define USB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */ +#define URB_ASYNC_UNLINK 0x0008 /* usb_unlink_urb() returns asap */ +#define URB_NO_FSBR 0x0020 /* UHCI-specific */ +#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */ #define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */ -#define USB_TIMEOUT_KILLED 0x1000 /* only set by HCD! */ +#define URB_TIMEOUT_KILLED 0x1000 /* only set by HCD! */ struct usb_iso_packet_descriptor { unsigned int offset; @@ -674,7 +672,7 @@ typedef void (*usb_complete_t)(struct urb *); * * All URBs submitted must initialize dev, pipe, * transfer_flags (may be zero), complete, timeout (may be zero). - * The USB_ASYNC_UNLINK transfer flag affects later invocations of + * The URB_ASYNC_UNLINK transfer flag affects later invocations of * the usb_unlink_urb() routine. * * All URBs must also initialize @@ -683,7 +681,7 @@ typedef void (*usb_complete_t)(struct urb *); * to be treated as errors; that flag is invalid for write requests. * * Bulk URBs may - * use the USB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers + * use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers * should always terminate with a short packet, even if it means adding an * extra zero length packet. * @@ -700,7 +698,7 @@ typedef void (*usb_complete_t)(struct urb *); * endpoints, as well as high speed interrupt endpoints, the encoding of * the transfer interval in the endpoint descriptor is logarithmic.) * - * Isochronous URBs normally use the USB_ISO_ASAP transfer flag, telling + * Isochronous URBs normally use the URB_ISO_ASAP transfer flag, telling * the host controller to schedule the transfer as soon as bandwidth * utilization allows, and then set start_frame to reflect the actual frame * selected during submission. Otherwise drivers must specify the start_frame diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 0b867f319abd..71186aa31378 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -82,7 +82,7 @@ MODULE_PARM_SYNTAX(pid, SNDRV_ENABLED ",allows:{{-1,0xffff}},base:16"); /* #define SND_USE_ASYNC_UNLINK */ #ifdef SND_USB_ASYNC_UNLINK -#define UNLINK_FLAGS USB_ASYNC_UNLINK +#define UNLINK_FLAGS URB_ASYNC_UNLINK #else #define UNLINK_FLAGS 0 #endif @@ -867,7 +867,7 @@ static int init_substream_urbs(snd_usb_substream_t *subs, snd_pcm_runtime_t *run } u->urb->dev = subs->dev; u->urb->pipe = subs->datapipe; - u->urb->transfer_flags = USB_ISO_ASAP | UNLINK_FLAGS; + u->urb->transfer_flags = URB_ISO_ASAP | UNLINK_FLAGS; u->urb->number_of_packets = u->packets; u->urb->context = u; u->urb->complete = snd_complete_urb; @@ -889,7 +889,7 @@ static int init_substream_urbs(snd_usb_substream_t *subs, snd_pcm_runtime_t *run u->urb->transfer_buffer_length = NRPACKS * 3; u->urb->dev = subs->dev; u->urb->pipe = subs->syncpipe; - u->urb->transfer_flags = USB_ISO_ASAP | UNLINK_FLAGS; + u->urb->transfer_flags = URB_ISO_ASAP | UNLINK_FLAGS; u->urb->number_of_packets = u->packets; u->urb->context = u; u->urb->complete = snd_complete_sync_urb; -- cgit v1.2.3 From a274edfa7cb2c82b8cda34b2525792ade7a8fa00 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:17:03 -0600 Subject: ISDN: header cosmetics Updating copyright lines, deleting the CVS $Id lines, move PPP CCP reset related declarations into drivers/isdn/i4l/isdn_ppp_ccp.c. --- drivers/isdn/i4l/isdn_audio.c | 10 +-- drivers/isdn/i4l/isdn_audio.h | 4 +- drivers/isdn/i4l/isdn_ciscohdlck.c | 3 +- drivers/isdn/i4l/isdn_ciscohdlck.h | 3 +- drivers/isdn/i4l/isdn_common.c | 5 +- drivers/isdn/i4l/isdn_common.h | 5 +- drivers/isdn/i4l/isdn_concap.c | 6 +- drivers/isdn/i4l/isdn_concap.h | 5 +- drivers/isdn/i4l/isdn_fsm.c | 9 +-- drivers/isdn/i4l/isdn_fsm.h | 9 +-- drivers/isdn/i4l/isdn_net.c | 8 +-- drivers/isdn/i4l/isdn_net.h | 12 ++-- drivers/isdn/i4l/isdn_net_lib.c | 3 +- drivers/isdn/i4l/isdn_ppp.c | 12 ++-- drivers/isdn/i4l/isdn_ppp.h | 6 +- drivers/isdn/i4l/isdn_ppp_ccp.c | 40 +++++++++++ drivers/isdn/i4l/isdn_ppp_ccp.h | 10 +++ drivers/isdn/i4l/isdn_ppp_mp.c | 19 +++++ drivers/isdn/i4l/isdn_ppp_mp.h | 11 ++- drivers/isdn/i4l/isdn_ppp_vj.c | 12 ++-- drivers/isdn/i4l/isdn_ppp_vj.h | 8 +++ drivers/isdn/i4l/isdn_tty.c | 6 +- drivers/isdn/i4l/isdn_tty.h | 5 +- drivers/isdn/i4l/isdn_ttyfax.c | 5 +- drivers/isdn/i4l/isdn_ttyfax.h | 5 +- drivers/isdn/i4l/isdn_v110.c | 5 +- drivers/isdn/i4l/isdn_v110.h | 5 +- drivers/isdn/i4l/isdn_x25iface.c | 9 ++- drivers/isdn/i4l/isdn_x25iface.h | 11 ++- include/linux/isdn.h | 8 +-- include/linux/isdn_ppp.h | 141 ++++++++++++++----------------------- 31 files changed, 201 insertions(+), 199 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_audio.c b/drivers/isdn/i4l/isdn_audio.c index bdd92d81d13d..3b2e0fc4d112 100644 --- a/drivers/isdn/i4l/isdn_audio.c +++ b/drivers/isdn/i4l/isdn_audio.c @@ -1,14 +1,14 @@ -/* $Id: isdn_audio.c,v 1.21.6.3 2002/08/13 09:45:33 keil Exp $ - * - * Linux ISDN subsystem, audio conversion and compression (linklevel). +/* Linux ISDN subsystem, audio conversion and compression * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) - * DTMF code (c) 1996 by Christian Mock (cm@tahina.priv.at) - * Silence detection (c) 1998 by Armin Schindler (mac@gismo.telekom.de) + * 1996 by Christian Mock (cm@tahina.priv.at) + * 1998 by Armin Schindler (mac@gismo.telekom.de) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * + * DTMF code by Christian Mock + * Silence detection by Armin Schindler */ #include diff --git a/drivers/isdn/i4l/isdn_audio.h b/drivers/isdn/i4l/isdn_audio.h index e60c980c953a..e08d7d2a0700 100644 --- a/drivers/isdn/i4l/isdn_audio.h +++ b/drivers/isdn/i4l/isdn_audio.h @@ -1,6 +1,4 @@ -/* $Id: isdn_audio.h,v 1.9.6.1 2001/09/23 22:24:31 kai Exp $ - * - * Linux ISDN subsystem, audio conversion and compression (linklevel). +/* Linux ISDN subsystem, audio conversion and compression * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) * diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.c b/drivers/isdn/i4l/isdn_ciscohdlck.c index cab5b1a2100f..c6c321fbe72b 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.c +++ b/drivers/isdn/i4l/isdn_ciscohdlck.c @@ -1,5 +1,4 @@ -/* - * Linux ISDN subsystem, CISCO HDLC network interfaces +/* Linux ISDN subsystem, CISCO HDLC network interfaces * * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) * 1995,96 by Thinking Objects Software GmbH Wuerzburg diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.h b/drivers/isdn/i4l/isdn_ciscohdlck.h index 24cd87d2f674..8eecdcb697b4 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.h +++ b/drivers/isdn/i4l/isdn_ciscohdlck.h @@ -1,5 +1,4 @@ -/* - * Linux ISDN subsystem, CISCO HDLC network interfaces +/* Linux ISDN subsystem, CISCO HDLC network interfaces * * Copyright 1999-2002 by Kai Germaschewski * 2001 by Bjoern A. Zeeb diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 37a7968aabb7..0d02b6226317 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1,6 +1,4 @@ -/* $Id: isdn_common.c,v 1.114.6.16 2001/11/06 20:58:28 kai Exp $ - * - * Linux ISDN subsystem, common used functions (linklevel). +/* Linux ISDN subsystem, common used functions * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) * Copyright 1995,96 Thinking Objects Software GmbH Wuerzburg @@ -8,7 +6,6 @@ * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #include diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index 64e1c1e9c819..e059ead2cc0c 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -1,7 +1,4 @@ -/* $Id: isdn_common.h,v 1.21.6.1 2001/09/23 22:24:31 kai Exp $ - * - * header for Linux ISDN subsystem - * common used functions and debugging-switches (linklevel). +/* Linux ISDN subsystem, common used functions and debugging-switches * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) * Copyright 1995,96 by Thinking Objects Software GmbH Wuerzburg diff --git a/drivers/isdn/i4l/isdn_concap.c b/drivers/isdn/i4l/isdn_concap.c index 935358fe2bb2..31e761e6c11c 100644 --- a/drivers/isdn/i4l/isdn_concap.c +++ b/drivers/isdn/i4l/isdn_concap.c @@ -1,16 +1,12 @@ -/* $Id: isdn_concap.c,v 1.8.6.1 2001/09/23 22:24:31 kai Exp $ - * - * Linux ISDN subsystem, protocol encapsulation +/* Linux ISDN subsystem, protocol encapsulation * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ /* Stuff to support the concap_proto by isdn4linux. isdn4linux - specific * stuff goes here. Stuff that depends only on the concap protocol goes to * another -- protocol specific -- source file. - * */ diff --git a/drivers/isdn/i4l/isdn_concap.h b/drivers/isdn/i4l/isdn_concap.h index 8150d6f595e0..49ee3cb27101 100644 --- a/drivers/isdn/i4l/isdn_concap.h +++ b/drivers/isdn/i4l/isdn_concap.h @@ -1,10 +1,7 @@ -/* $Id: isdn_concap.h,v 1.3.6.1 2001/09/23 22:24:31 kai Exp $ - * - * Linux ISDN subsystem, protocol encapsulation +/* Linux ISDN subsystem, protocol encapsulation * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ extern struct concap_device_ops isdn_concap_reliable_dl_dops; diff --git a/drivers/isdn/i4l/isdn_fsm.c b/drivers/isdn/i4l/isdn_fsm.c index 52de59763fe8..5e453f1edd62 100644 --- a/drivers/isdn/i4l/isdn_fsm.c +++ b/drivers/isdn/i4l/isdn_fsm.c @@ -1,17 +1,14 @@ -/* $Id: fsm.c,v 1.14.6.4 2001/09/23 22:24:47 kai Exp $ - * - * Finite state machine +/* Linux ISDN subsystem, finite state machine * * Author Karsten Keil - * Copyright by Karsten Keil - * by Kai Germaschewski + * Copyright by Karsten Keil + * 2001-2002 by Kai Germaschewski * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * * Thanks to Jan den Ouden * Fritz Elfert - * */ #include diff --git a/drivers/isdn/i4l/isdn_fsm.h b/drivers/isdn/i4l/isdn_fsm.h index 4a48a401da45..95beb142b392 100644 --- a/drivers/isdn/i4l/isdn_fsm.h +++ b/drivers/isdn/i4l/isdn_fsm.h @@ -1,14 +1,11 @@ -/* $Id: fsm.h,v 1.3.2.2 2001/09/23 22:24:47 kai Exp $ - * - * Finite state machine +/* Linux ISDN subsystem, finite state machine * * Author Karsten Keil - * Copyright by Karsten Keil - * by Kai Germaschewski + * Copyright by Karsten Keil + * 2001-2002 by Kai Germaschewski * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #ifndef __ISDN_FSM_H__ diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c index 26668600867c..c41f6e0ef850 100644 --- a/drivers/isdn/i4l/isdn_net.c +++ b/drivers/isdn/i4l/isdn_net.c @@ -1,6 +1,4 @@ -/* $Id: isdn_net.c,v 1.140.6.11 2001/11/06 20:58:28 kai Exp $ - * - * Linux ISDN subsystem, network interfaces and related functions (linklevel). +/* Linux ISDN subsystem, network interfaces and related functions (linklevel). * * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) * 1995,96 by Thinking Objects Software GmbH Wuerzburg @@ -9,7 +7,9 @@ * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * + */ + +/* * Data Over Voice (DOV) support added - Guy Ellis 23-Mar-02 * guy@traverse.com.au * Outgoing calls - looks for a 'V' in first char of dialed number diff --git a/drivers/isdn/i4l/isdn_net.h b/drivers/isdn/i4l/isdn_net.h index 01ad56c3e926..1f4933dd0f7a 100644 --- a/drivers/isdn/i4l/isdn_net.h +++ b/drivers/isdn/i4l/isdn_net.h @@ -1,14 +1,12 @@ -/* $Id: isdn_net.h,v 1.19.6.4 2001/09/28 08:05:29 kai Exp $ - * - * header for Linux ISDN subsystem, network related functions (linklevel). +/* Linux ISDN subsystem, network related functions * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) - * Copyright 1995,96 by Thinking Objects Software GmbH Wuerzburg - * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1995,96 by Thinking Objects Software GmbH Wuerzburg + * 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #include @@ -39,6 +37,8 @@ int isdn_net_autodial(struct sk_buff *skb, struct net_device *ndev); isdn_net_dev *isdn_net_get_xmit_dev(isdn_net_local *mlp); void isdn_netif_rx(isdn_net_dev *idev, struct sk_buff *skb, u16 protocol); +/* ====================================================================== */ + static inline int put_u8(unsigned char *p, u8 x) { diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c index dd311872747c..2684ba648e72 100644 --- a/drivers/isdn/i4l/isdn_net_lib.c +++ b/drivers/isdn/i4l/isdn_net_lib.c @@ -1,5 +1,4 @@ -/* - * Linux ISDN subsystem, Network interface configuration +/* Linux ISDN subsystem, Network interface configuration * * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) * 1995,96 by Thinking Objects Software GmbH Wuerzburg diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index b50fd57a1707..4d2b0a137dc9 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c @@ -1,12 +1,10 @@ -/* $Id: isdn_ppp.c,v 1.85.6.9 2001/11/06 20:58:28 kai Exp $ +/* Linux ISDN subsystem, functions for synchronous PPP (linklevel). * - * Linux ISDN subsystem, functions for synchronous PPP (linklevel). - * - * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #include @@ -23,6 +21,10 @@ #include "isdn_ppp_mp.h" #include "isdn_net.h" +/* ====================================================================== */ + +#define IPPP_MAX_RQ_LEN 8 /* max #frames queued for ipppd to read */ + static int isdn_ppp_set_compressor(isdn_net_dev *idev, struct isdn_ppp_comp_data *); diff --git a/drivers/isdn/i4l/isdn_ppp.h b/drivers/isdn/i4l/isdn_ppp.h index 136077ec8bba..fc74cada051a 100644 --- a/drivers/isdn/i4l/isdn_ppp.h +++ b/drivers/isdn/i4l/isdn_ppp.h @@ -1,12 +1,10 @@ -/* $Id: isdn_ppp.h,v 1.17.6.1 2001/09/23 22:24:32 kai Exp $ - * - * header for Linux ISDN subsystem, functions for synchronous PPP (linklevel). +/* Linux ISDN subsystem, functions for synchronous PPP (linklevel). * * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #include /* for PPP_PROTOCOL */ diff --git a/drivers/isdn/i4l/isdn_ppp_ccp.c b/drivers/isdn/i4l/isdn_ppp_ccp.c index f62cf38f831f..3e4e24379aba 100644 --- a/drivers/isdn/i4l/isdn_ppp_ccp.c +++ b/drivers/isdn/i4l/isdn_ppp_ccp.c @@ -1,3 +1,13 @@ +/* Linux ISDN subsystem, PPP CCP support + * + * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) + * 1995,96 by Thinking Objects Software GmbH Wuerzburg + * 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ #include "isdn_ppp_ccp.h" #include "isdn_common.h" @@ -5,6 +15,36 @@ #include "isdn_ppp.h" #include +/* ====================================================================== */ +enum ippp_ccp_reset_states { + CCPResetIdle, + CCPResetSentReq, + CCPResetRcvdReq, + CCPResetSentAck, + CCPResetRcvdAck +}; + +struct ippp_ccp_reset_state { + enum ippp_ccp_reset_states state;/* State of this transaction */ + struct ippp_ccp *ccp; /* Backlink */ + unsigned char id; /* id index */ + unsigned char ta:1; /* The timer is active (flag) */ + unsigned char expra:1; /* We expect a ResetAck at all */ + int dlen; /* Databytes stored in data */ + struct timer_list timer; /* For timeouts/retries */ + /* This is a hack but seems sufficient for the moment. We do not want + to have this be yet another allocation for some bytes, it is more + memory management overhead than the whole mess is worth. */ + unsigned char data[IPPP_RESET_MAXDATABYTES]; +}; + +/* The data structure keeping track of the currently outstanding CCP Reset + transactions. */ +struct ippp_ccp_reset { + struct ippp_ccp_reset_state *rs[256]; /* One per possible id */ + unsigned char lastid; /* Last id allocated */ +}; + /* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary, but absolutely nontrivial. The most abstruse problem we are facing is that the generation, reception and all the handling of timeouts and diff --git a/drivers/isdn/i4l/isdn_ppp_ccp.h b/drivers/isdn/i4l/isdn_ppp_ccp.h index 35d7e75dc343..6d3ec7c9f8de 100644 --- a/drivers/isdn/i4l/isdn_ppp_ccp.h +++ b/drivers/isdn/i4l/isdn_ppp_ccp.h @@ -1,3 +1,13 @@ +/* Linux ISDN subsystem, PPP CCP support + * + * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) + * 1995,96 by Thinking Objects Software GmbH Wuerzburg + * 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ #include #include diff --git a/drivers/isdn/i4l/isdn_ppp_mp.c b/drivers/isdn/i4l/isdn_ppp_mp.c index 06545577de7b..3f2345f9197d 100644 --- a/drivers/isdn/i4l/isdn_ppp_mp.c +++ b/drivers/isdn/i4l/isdn_ppp_mp.c @@ -1,3 +1,13 @@ +/* Linux ISDN subsystem, PPP CCP support + * + * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) + * 1995,96 by Thinking Objects Software GmbH Wuerzburg + * 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ #include "isdn_ppp_mp.h" #include "isdn_ppp_ccp.h" @@ -5,6 +15,15 @@ #include "isdn_net.h" #include "isdn_ppp.h" +/* ====================================================================== */ + +#define MP_END_FRAG 0x40 +#define MP_BEGIN_FRAG 0x80 + +#define MP_MAX_QUEUE_LEN 16 + +/* ====================================================================== */ + int ippp_mp_bind(isdn_net_dev *idev) { diff --git a/drivers/isdn/i4l/isdn_ppp_mp.h b/drivers/isdn/i4l/isdn_ppp_mp.h index 3ae3c9c59354..4eacffc728ef 100644 --- a/drivers/isdn/i4l/isdn_ppp_mp.h +++ b/drivers/isdn/i4l/isdn_ppp_mp.h @@ -1,3 +1,13 @@ +/* Linux ISDN subsystem, PPP CCP support + * + * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) + * 1995,96 by Thinking Objects Software GmbH Wuerzburg + * 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ #ifndef __ISDN_PPP_MP_H__ #define __ISDN_PPP_MP_H__ @@ -5,7 +15,6 @@ #include #include - #ifdef CONFIG_ISDN_MPP int ippp_mp_bind(isdn_net_dev *idev); diff --git a/drivers/isdn/i4l/isdn_ppp_vj.c b/drivers/isdn/i4l/isdn_ppp_vj.c index 4e2bb3af7c51..ef97182b5800 100644 --- a/drivers/isdn/i4l/isdn_ppp_vj.c +++ b/drivers/isdn/i4l/isdn_ppp_vj.c @@ -1,13 +1,17 @@ +/* Linux ISDN subsystem, PPP VJ header compression + * + * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ #include "isdn_ppp_vj.h" #include "isdn_common.h" #include "isdn_net.h" #include "isdn_ppp.h" -/* ====================================================================== */ -/* VJ header compression */ -/* ====================================================================== */ - struct slcompress * ippp_vj_alloc(void) { diff --git a/drivers/isdn/i4l/isdn_ppp_vj.h b/drivers/isdn/i4l/isdn_ppp_vj.h index 7197a1f363fe..1af3ca9049e2 100644 --- a/drivers/isdn/i4l/isdn_ppp_vj.h +++ b/drivers/isdn/i4l/isdn_ppp_vj.h @@ -1,3 +1,11 @@ +/* Linux ISDN subsystem, PPP VJ header compression + * + * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * 1999-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ #ifndef __ISDN_PPP_VJ_H__ #define __ISDN_PPP_VJ_H__ diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index c7b3f8ce4c71..eb79e21a5aeb 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -1,14 +1,12 @@ -/* $Id: isdn_tty.c,v 1.94.6.9 2001/11/06 20:58:29 kai Exp $ - * - * Linux ISDN subsystem, tty functions and AT-command emulator (linklevel). +/* Linux ISDN subsystem, tty functions and AT-command emulator * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) * Copyright 1995,96 by Thinking Objects Software GmbH Wuerzburg * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ + #undef ISDN_TTY_STAT_DEBUG #include diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 8cad26a3714a..9863a7577f16 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -1,13 +1,10 @@ -/* $Id: isdn_tty.h,v 1.22.6.2 2001/09/23 22:24:32 kai Exp $ - * - * header for Linux ISDN subsystem, tty related functions (linklevel). +/* Linux ISDN subsystem, tty related functions * * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) * Copyright 1995,96 by Thinking Objects Software GmbH Wuerzburg * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #include diff --git a/drivers/isdn/i4l/isdn_ttyfax.c b/drivers/isdn/i4l/isdn_ttyfax.c index 2f7a5a0f2b48..14f7122d098a 100644 --- a/drivers/isdn/i4l/isdn_ttyfax.c +++ b/drivers/isdn/i4l/isdn_ttyfax.c @@ -1,6 +1,4 @@ -/* $Id: isdn_ttyfax.c,v 1.7.6.2 2001/09/23 22:24:32 kai Exp $ - * - * Linux ISDN subsystem, tty_fax AT-command emulator (linklevel). +/* Linux ISDN subsystem, tty_fax AT-command emulator * * Copyright 1999 by Armin Schindler (mac@melware.de) * Copyright 1999 by Ralf Spachmann (mel@melware.de) @@ -8,7 +6,6 @@ * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #undef ISDN_TTY_FAX_STAT_DEBUG diff --git a/drivers/isdn/i4l/isdn_ttyfax.h b/drivers/isdn/i4l/isdn_ttyfax.h index 244ada3ca127..3567899e4e88 100644 --- a/drivers/isdn/i4l/isdn_ttyfax.h +++ b/drivers/isdn/i4l/isdn_ttyfax.h @@ -1,6 +1,4 @@ -/* $Id: isdn_ttyfax.h,v 1.2.6.1 2001/09/23 22:24:32 kai Exp $ - * - * header for Linux ISDN subsystem, tty_fax related functions (linklevel). +/* Linux ISDN subsystem, tty_fax related functions * * Copyright 1999 by Armin Schindler (mac@melware.de) * Copyright 1999 by Ralf Spachmann (mel@melware.de) @@ -8,7 +6,6 @@ * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ diff --git a/drivers/isdn/i4l/isdn_v110.c b/drivers/isdn/i4l/isdn_v110.c index 1676de4975cc..421764a27289 100644 --- a/drivers/isdn/i4l/isdn_v110.c +++ b/drivers/isdn/i4l/isdn_v110.c @@ -1,12 +1,9 @@ -/* $Id: isdn_v110.c,v 1.5.6.4 2001/09/23 22:24:32 kai Exp $ - * - * Linux ISDN subsystem, V.110 related functions (linklevel). +/* Linux ISDN subsystem, V.110 * * Copyright by Thomas Pfeiffer (pfeiffer@pds.de) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #include diff --git a/drivers/isdn/i4l/isdn_v110.h b/drivers/isdn/i4l/isdn_v110.h index b6563c259e44..ba0bf9d38286 100644 --- a/drivers/isdn/i4l/isdn_v110.h +++ b/drivers/isdn/i4l/isdn_v110.h @@ -1,12 +1,9 @@ -/* $Id: isdn_v110.h,v 1.4.6.1 2001/09/23 22:24:32 kai Exp $ - * - * Linux ISDN subsystem, V.110 related functions (linklevel). +/* Linux ISDN subsystem, V.110 related functions * * Copyright by Thomas Pfeiffer (pfeiffer@pds.de) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #ifndef ISDN_V110_H diff --git a/drivers/isdn/i4l/isdn_x25iface.c b/drivers/isdn/i4l/isdn_x25iface.c index edbf4eed016d..d394b4a39bd4 100644 --- a/drivers/isdn/i4l/isdn_x25iface.c +++ b/drivers/isdn/i4l/isdn_x25iface.c @@ -1,10 +1,10 @@ -/* $Id: isdn_x25iface.c,v 1.9.6.1 2001/09/23 22:24:32 kai Exp $ - * - * Linux ISDN subsystem, X.25 related functions +/* * Linux ISDN subsystem, X.25 related functions * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * + */ + +/* * stuff needed to support the Linux X.25 PLP code on top of devices that * can provide a lab_b service using the concap_proto mechanism. * This module supports a network interface wich provides lapb_sematics @@ -17,7 +17,6 @@ * */ -/* #include */ #include #include #include diff --git a/drivers/isdn/i4l/isdn_x25iface.h b/drivers/isdn/i4l/isdn_x25iface.h index ef69d3af9628..12fc46c471af 100644 --- a/drivers/isdn/i4l/isdn_x25iface.h +++ b/drivers/isdn/i4l/isdn_x25iface.h @@ -1,17 +1,16 @@ -/* $Id: isdn_x25iface.h,v 1.3.6.1 2001/09/23 22:24:32 kai Exp $ - * - * header for Linux ISDN subsystem, x.25 related functions +/* Linux ISDN subsystem, x.25 related functions * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. - * */ #ifndef _LINUX_ISDN_X25IFACE_H #define _LINUX_ISDN_X25IFACE_H #define ISDN_X25IFACE_MAGIC 0x1e75a2b9 -/* #define DEBUG_ISDN_X25 if you want isdn_x25 debugging messages */ + +#undef DEBUG_ISDN_X25 + #ifdef DEBUG_ISDN_X25 # define IX25DEBUG(fmt,args...) printk(KERN_DEBUG fmt , ## args) #else @@ -26,8 +25,6 @@ extern struct concap_proto_ops * isdn_x25iface_concap_proto_ops_pt; extern struct concap_proto * isdn_x25iface_proto_new(void); - - #endif diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 362161a2ef76..42baf99a835a 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -1,10 +1,9 @@ -/* $Id: isdn.h,v 1.111.6.9 2001/09/23 22:25:05 kai Exp $ - * - * Main header for the Linux ISDN subsystem (linklevel). +/* Linux ISDN subsystem, main header * * Copyright 1994,95,96 by Fritz Elfert (fritz@isdn4linux.de) * Copyright 1995,96 by Thinking Objects Software GmbH Wuerzburg * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * Copyright 2000-2002 by Kai Germaschewski (kai@germaschewski.name) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. @@ -441,9 +440,6 @@ typedef struct isdn_net_dev_s { u32 mp_rxseq; /* last seq no seen on this channel */ struct ippp_ccp *ccp; unsigned long debug; - - ippp_bundle * pb; /* pointer to the common bundle structure - * with the per-bundle data */ #endif #ifdef CONFIG_ISDN_X25 struct concap_proto *cprot; /* connection oriented encapsulation protocol */ diff --git a/include/linux/isdn_ppp.h b/include/linux/isdn_ppp.h index b53107c1b1b4..669822e2868a 100644 --- a/include/linux/isdn_ppp.h +++ b/include/linux/isdn_ppp.h @@ -1,10 +1,15 @@ -/* +/* Linux ISDN subsystem, sync PPP, interface to ipppd + * + * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) + * Copyright 1995,96 Thinking Objects Software GmbH Wuerzburg + * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) + * Copyright 2000-2002 by Kai Germaschewski (kai@germaschewski.name) + * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * */ - #ifndef _LINUX_ISDN_PPP_H #define _LINUX_ISDN_PPP_H @@ -16,22 +21,21 @@ struct pppcallinfo { - int calltype; - unsigned char local_num[64]; - unsigned char remote_num[64]; - int charge_units; + int calltype; + unsigned char local_num[64]; + unsigned char remote_num[64]; + int charge_units; }; -#define PPPIOCGCALLINFO _IOWR('t',128,struct pppcallinfo) -#define PPPIOCBUNDLE _IOW('t',129,int) -#define PPPIOCGMPFLAGS _IOR('t',130,int) -#define PPPIOCSMPFLAGS _IOW('t',131,int) -#define PPPIOCSMPMTU _IOW('t',132,int) -#define PPPIOCSMPMRU _IOW('t',133,int) -#define PPPIOCGCOMPRESSORS _IOR('t',134,unsigned long [8]) -#define PPPIOCSCOMPRESSOR _IOW('t',135,int) -#define PPPIOCGIFNAME _IOR('t',136, char [IFNAMSIZ] ) - +#define PPPIOCGCALLINFO _IOWR('t',128,struct pppcallinfo) +#define PPPIOCBUNDLE _IOW('t',129,int) +#define PPPIOCGMPFLAGS _IOR('t',130,int) +#define PPPIOCSMPFLAGS _IOW('t',131,int) +#define PPPIOCSMPMTU _IOW('t',132,int) +#define PPPIOCSMPMRU _IOW('t',133,int) +#define PPPIOCGCOMPRESSORS _IOR('t',134,unsigned long[8]) +#define PPPIOCSCOMPRESSOR _IOW('t',135,int) +#define PPPIOCGIFNAME _IOR('t',136,char[IFNAMSIZ]) #define SC_MP_PROT 0x00000200 #define SC_REJ_MP_PROT 0x00000400 @@ -44,26 +48,19 @@ struct pppcallinfo #define IPPP_COMP_FLAG_LINK 0x2 struct isdn_ppp_comp_data { - int num; - unsigned char options[ISDN_PPP_COMP_MAX_OPTIONS]; - int optlen; - int flags; + int num; + unsigned char options[ISDN_PPP_COMP_MAX_OPTIONS]; + int optlen; + int flags; }; #ifdef __KERNEL__ - -#include #include #include #define DECOMP_ERR_NOMEM (-10) -#define MP_END_FRAG 0x40 -#define MP_BEGIN_FRAG 0x80 - -#define MP_MAX_QUEUE_LEN 16 - /* * We need a way for the decompressor to influence the generation of CCP * Reset-Requests in a variety of ways. The decompressor is already returning @@ -82,15 +79,15 @@ struct isdn_ppp_comp_data { #define IPPP_RESET_MAXDATABYTES 32 struct isdn_ppp_resetparams { - unsigned char valid:1; /* rw Is this structure filled at all ? */ - unsigned char rsend:1; /* rw Should we send one at all ? */ - unsigned char idval:1; /* rw Is the id field valid ? */ - unsigned char dtval:1; /* rw Is the data field valid ? */ - unsigned char expra:1; /* rw Is an Ack expected for this Req ? */ - unsigned char id; /* wo Send CCP ResetReq with this id */ - unsigned short maxdlen; /* ro Max bytes to be stored in data field */ - unsigned short dlen; /* rw Bytes stored in data field */ - unsigned char *data; /* wo Data for ResetReq info field */ + unsigned char valid:1; /* rw Is this structure filled at all ? */ + unsigned char rsend:1; /* rw Should we send one at all ? */ + unsigned char idval:1; /* rw Is the id field valid ? */ + unsigned char dtval:1; /* rw Is the data field valid ? */ + unsigned char expra:1; /* rw Is an Ack expected for this Req ? */ + unsigned char id; /* wo Send CCP ResetReq with this id */ + unsigned short maxdlen; /* ro Max bytes to be stored in data field */ + unsigned short dlen; /* rw Bytes stored in data field */ + unsigned char *data; /* wo Data for ResetReq info field */ }; /* @@ -98,73 +95,37 @@ struct isdn_ppp_resetparams { * check the original include for more information */ struct isdn_ppp_compressor { - struct isdn_ppp_compressor *next, *prev; - int num; /* CCP compression protocol number */ + struct isdn_ppp_compressor *next, *prev; + int num; /* CCP compression protocol number */ - void *(*alloc) (struct isdn_ppp_comp_data *); - void (*free) (void *state); - int (*init) (void *state, struct isdn_ppp_comp_data *, - int unit,int debug); + void *(*alloc) (struct isdn_ppp_comp_data *); + void (*free) (void *state); + int (*init) (void *state, struct isdn_ppp_comp_data *, + int unit,int debug); - /* The reset entry needs to get more exact information about the - ResetReq or ResetAck it was called with. The parameters are - obvious. If reset is called without a Req or Ack frame which - could be handed into it, code MUST be set to 0. Using rsparm, - the reset entry can control if and how a ResetAck is returned. */ + /* The reset entry needs to get more exact information about the + ResetReq or ResetAck it was called with. The parameters are + obvious. If reset is called without a Req or Ack frame which + could be handed into it, code MUST be set to 0. Using rsparm, + the reset entry can control if and how a ResetAck is returned. */ - void (*reset) (void *state, unsigned char code, unsigned char id, - unsigned char *data, unsigned len, - struct isdn_ppp_resetparams *rsparm); + void (*reset) (void *state, unsigned char code, unsigned char id, + unsigned char *data, unsigned len, + struct isdn_ppp_resetparams *rsparm); - int (*compress) (void *state, struct sk_buff *in, - struct sk_buff *skb_out, int proto); + int (*compress) (void *state, struct sk_buff *in, + struct sk_buff *skb_out, int proto); int (*decompress) (void *state,struct sk_buff *in, struct sk_buff *skb_out, struct isdn_ppp_resetparams *rsparm); - void (*incomp) (void *state, struct sk_buff *in,int proto); - void (*stat) (void *state, struct compstat *stats); + void (*incomp) (void *state, struct sk_buff *in,int proto); + void (*stat) (void *state, struct compstat *stats); }; extern int isdn_ppp_register_compressor(struct isdn_ppp_compressor *); extern int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *); -typedef struct { - int mp_mrru; /* unused */ -} ippp_bundle; - -#define IPPP_MAX_RQ_LEN 8 - -/* The data structure for one CCP reset transaction */ -enum ippp_ccp_reset_states { - CCPResetIdle, - CCPResetSentReq, - CCPResetRcvdReq, - CCPResetSentAck, - CCPResetRcvdAck -}; - -struct ippp_ccp_reset_state { - enum ippp_ccp_reset_states state; /* State of this transaction */ - struct ippp_ccp *ccp; /* Backlink */ - unsigned char id; /* id index */ - unsigned char ta:1; /* The timer is active (flag) */ - unsigned char expra:1; /* We expect a ResetAck at all */ - int dlen; /* Databytes stored in data */ - struct timer_list timer; /* For timeouts/retries */ - /* This is a hack but seems sufficient for the moment. We do not want - to have this be yet another allocation for some bytes, it is more - memory management overhead than the whole mess is worth. */ - unsigned char data[IPPP_RESET_MAXDATABYTES]; -}; - -/* The data structure keeping track of the currently outstanding CCP Reset - transactions. */ -struct ippp_ccp_reset { - struct ippp_ccp_reset_state *rs[256]; /* One per possible id */ - unsigned char lastid; /* Last id allocated by the engine */ -}; - #endif /* __KERNEL__ */ #endif /* _LINUX_ISDN_PPP_H */ -- cgit v1.2.3 From fa581f7120af893d256f62ffef394cdd59caa356 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:25:55 -0600 Subject: ISDN: Move drivers/isdn/i4l/isdn_fsm.h include/linux/isdn/fsm.h Though I've been mostly moving stuff out of include/linux and into drivers/isdn/i4l, the finite state machine definitions actually need to be more wildly accessible, so they go the opposite way. --- drivers/isdn/i4l/isdn_fsm.c | 2 +- drivers/isdn/i4l/isdn_fsm.h | 58 ----------------------------------------- drivers/isdn/i4l/isdn_net_lib.c | 1 - include/linux/isdn.h | 4 +-- include/linux/isdn/fsm.h | 58 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 63 deletions(-) delete mode 100644 drivers/isdn/i4l/isdn_fsm.h create mode 100644 include/linux/isdn/fsm.h (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_fsm.c b/drivers/isdn/i4l/isdn_fsm.c index 5e453f1edd62..673b3ad9d632 100644 --- a/drivers/isdn/i4l/isdn_fsm.c +++ b/drivers/isdn/i4l/isdn_fsm.c @@ -16,7 +16,7 @@ #include #include #include -#include "isdn_fsm.h" +#include int fsm_new(struct fsm *fsm) diff --git a/drivers/isdn/i4l/isdn_fsm.h b/drivers/isdn/i4l/isdn_fsm.h deleted file mode 100644 index 95beb142b392..000000000000 --- a/drivers/isdn/i4l/isdn_fsm.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Linux ISDN subsystem, finite state machine - * - * Author Karsten Keil - * Copyright by Karsten Keil - * 2001-2002 by Kai Germaschewski - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - */ - -#ifndef __ISDN_FSM_H__ -#define __ISDN_FSM_H__ - -#include -#include - -struct fsm_inst; - -typedef int (*fsm_fn)(struct fsm_inst *, int, void *); - -struct fsm { - fsm_fn *jumpmatrix; - int st_cnt, ev_cnt, fn_cnt; - char **st_str, **ev_str; - struct fsm_node *fn_tbl; -}; - -struct fsm_inst { - struct fsm *fsm; - int state; - int debug; - void *userdata; - int userint; - void (*printdebug) (struct fsm_inst *, char *, ...); -}; - -struct fsm_node { - int st, ev; - fsm_fn fn; -}; - -struct fsm_timer { - struct fsm_inst *fi; - struct timer_list tl; - int ev; - void *arg; -}; - -int fsm_new(struct fsm *fsm); -void fsm_free(struct fsm *fsm); -int fsm_event(struct fsm_inst *fi, int event, void *arg); -void fsm_change_state(struct fsm_inst *fi, int newstate); -void fsm_init_timer(struct fsm_inst *fi, struct fsm_timer *ft); -int fsm_add_timer(struct fsm_timer *ft, int timeout, int event); -void fsm_mod_timer(struct fsm_timer *ft, int timeout, int event); -void fsm_del_timer(struct fsm_timer *ft); - -#endif diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c index 2fcafe906181..8bc24804a21d 100644 --- a/drivers/isdn/i4l/isdn_net_lib.c +++ b/drivers/isdn/i4l/isdn_net_lib.c @@ -56,7 +56,6 @@ #include "isdn_common.h" #include "isdn_net.h" #include "isdn_ppp.h" -#include "isdn_fsm.h" #define ISDN_NET_TX_TIMEOUT (20*HZ) diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 42baf99a835a..5055fbe6b687 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -14,9 +14,7 @@ #define __ISDN_H__ #include - -// FIXME!!! -#include <../drivers/isdn/i4l/isdn_fsm.h> +#include #ifdef CONFIG_COBALT_MICRO_SERVER /* Save memory */ diff --git a/include/linux/isdn/fsm.h b/include/linux/isdn/fsm.h new file mode 100644 index 000000000000..95beb142b392 --- /dev/null +++ b/include/linux/isdn/fsm.h @@ -0,0 +1,58 @@ +/* Linux ISDN subsystem, finite state machine + * + * Author Karsten Keil + * Copyright by Karsten Keil + * 2001-2002 by Kai Germaschewski + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ + +#ifndef __ISDN_FSM_H__ +#define __ISDN_FSM_H__ + +#include +#include + +struct fsm_inst; + +typedef int (*fsm_fn)(struct fsm_inst *, int, void *); + +struct fsm { + fsm_fn *jumpmatrix; + int st_cnt, ev_cnt, fn_cnt; + char **st_str, **ev_str; + struct fsm_node *fn_tbl; +}; + +struct fsm_inst { + struct fsm *fsm; + int state; + int debug; + void *userdata; + int userint; + void (*printdebug) (struct fsm_inst *, char *, ...); +}; + +struct fsm_node { + int st, ev; + fsm_fn fn; +}; + +struct fsm_timer { + struct fsm_inst *fi; + struct timer_list tl; + int ev; + void *arg; +}; + +int fsm_new(struct fsm *fsm); +void fsm_free(struct fsm *fsm); +int fsm_event(struct fsm_inst *fi, int event, void *arg); +void fsm_change_state(struct fsm_inst *fi, int newstate); +void fsm_init_timer(struct fsm_inst *fi, struct fsm_timer *ft); +int fsm_add_timer(struct fsm_timer *ft, int timeout, int event); +void fsm_mod_timer(struct fsm_timer *ft, int timeout, int event); +void fsm_del_timer(struct fsm_timer *ft); + +#endif -- cgit v1.2.3 From dbf409677625ce034e4d9b83b589c224c750fdc9 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:26:44 -0600 Subject: ISDN: Move ISDN net lib interface related definitions into isdn_net_lib.h --- drivers/isdn/i4l/isdn_ciscohdlck.c | 4 +- drivers/isdn/i4l/isdn_ciscohdlck.h | 2 +- drivers/isdn/i4l/isdn_common.c | 7 ++-- drivers/isdn/i4l/isdn_net.c | 46 +++-------------------- drivers/isdn/i4l/isdn_net.h | 77 ++------------------------------------ drivers/isdn/i4l/isdn_net_lib.c | 19 +++++++++- drivers/isdn/i4l/isdn_ppp.c | 2 +- drivers/isdn/i4l/isdn_ppp_ccp.c | 2 +- drivers/isdn/i4l/isdn_ppp_mp.c | 2 +- drivers/isdn/i4l/isdn_ppp_vj.c | 2 +- include/linux/isdn.h | 31 --------------- 11 files changed, 38 insertions(+), 156 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.c b/drivers/isdn/i4l/isdn_ciscohdlck.c index c6c321fbe72b..669dc1c7bb93 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.c +++ b/drivers/isdn/i4l/isdn_ciscohdlck.c @@ -13,7 +13,7 @@ */ #include "isdn_common.h" -#include "isdn_net.h" +#include "isdn_net_lib.h" #include "isdn_ciscohdlck.h" #include @@ -417,7 +417,7 @@ isdn_ciscohdlck_header(struct sk_buff *skb, struct net_device *dev, return 4; } -struct isdn_netif_ops ciscohdlck_ops = { +struct isdn_netif_ops isdn_ciscohdlck_ops = { .hard_start_xmit = isdn_net_start_xmit, .hard_header = isdn_ciscohdlck_header, .do_ioctl = isdn_ciscohdlck_dev_ioctl, diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.h b/drivers/isdn/i4l/isdn_ciscohdlck.h index 8eecdcb697b4..c9cebdaf5395 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.h +++ b/drivers/isdn/i4l/isdn_ciscohdlck.h @@ -10,6 +10,6 @@ #ifndef ISDN_CISCOHDLCK_H #define ISDN_CISCOHDLCK_H -extern struct isdn_netif_ops ciscohdlck_ops; +extern struct isdn_netif_ops isdn_ciscohdlck_ops; #endif diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 0ddb680cc3af..ac4ab500a97d 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -18,8 +18,9 @@ #include #include #include "isdn_common.h" -#include "isdn_tty.h" +#include "isdn_net_lib.h" #include "isdn_net.h" +#include "isdn_tty.h" #include "isdn_ppp.h" #ifdef CONFIG_ISDN_AUDIO #include "isdn_audio.h" @@ -2183,7 +2184,7 @@ static int __init isdn_init(void) } #endif /* CONFIG_ISDN_PPP */ - isdn_net_init(); + isdn_net_lib_init(); printk(KERN_NOTICE "ISDN subsystem initialized\n"); isdn_info_update(); return 0; @@ -2211,7 +2212,7 @@ static void __exit isdn_exit(void) #endif save_flags(flags); cli(); - isdn_net_exit(); + isdn_net_lib_exit(); isdn_tty_exit(); if (unregister_chrdev(ISDN_MAJOR, "isdn")) diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c index 53b9748937bd..370e3e5f8011 100644 --- a/drivers/isdn/i4l/isdn_net.c +++ b/drivers/isdn/i4l/isdn_net.c @@ -9,18 +9,12 @@ * of the GNU General Public License, incorporated herein by reference. */ -#include #include -#include -#include -#include #include +#include #include "isdn_common.h" +#include "isdn_net_lib.h" #include "isdn_net.h" -#include "isdn_ppp.h" -#include -#include "isdn_concap.h" -#include "isdn_ciscohdlck.h" // ISDN_NET_ENCAP_IPTYP // ethernet type field @@ -46,7 +40,7 @@ isdn_iptyp_receive(isdn_net_local *lp, isdn_net_dev *idev, isdn_netif_rx(idev, skb, protocol); } -static struct isdn_netif_ops iptyp_ops = { +struct isdn_netif_ops isdn_iptyp_ops = { .hard_start_xmit = isdn_net_start_xmit, .hard_header = isdn_iptyp_header, .flags = IFF_NOARP | IFF_POINTOPOINT, @@ -76,7 +70,7 @@ isdn_uihdlc_receive(isdn_net_local *lp, isdn_net_dev *idev, isdn_netif_rx(idev, skb, htons(ETH_P_IP)); } -static struct isdn_netif_ops uihdlc_ops = { +struct isdn_netif_ops isdn_uihdlc_ops = { .hard_start_xmit = isdn_net_start_xmit, .hard_header = isdn_uihdlc_header, .flags = IFF_NOARP | IFF_POINTOPOINT, @@ -98,7 +92,7 @@ isdn_rawip_receive(isdn_net_local *lp, isdn_net_dev *idev, netif_rx(skb); } -static struct isdn_netif_ops rawip_ops = { +struct isdn_netif_ops isdn_rawip_ops = { .hard_start_xmit = isdn_net_start_xmit, .flags = IFF_NOARP | IFF_POINTOPOINT, .type = ARPHRD_PPP, @@ -148,37 +142,9 @@ isdn_ether_init(isdn_net_local *lp) return 0; } -static struct isdn_netif_ops ether_ops = { +struct isdn_netif_ops isdn_ether_ops = { .hard_start_xmit = isdn_net_start_xmit, .receive = isdn_ether_receive, .init = isdn_ether_init, .open = isdn_ether_open, }; - -// ====================================================================== - -void -isdn_net_init(void) -{ - isdn_net_lib_init(); - - register_isdn_netif(ISDN_NET_ENCAP_ETHER, ðer_ops); - register_isdn_netif(ISDN_NET_ENCAP_RAWIP, &rawip_ops); - register_isdn_netif(ISDN_NET_ENCAP_IPTYP, &iptyp_ops); - register_isdn_netif(ISDN_NET_ENCAP_UIHDLC, &uihdlc_ops); - register_isdn_netif(ISDN_NET_ENCAP_CISCOHDLC, &ciscohdlck_ops); - register_isdn_netif(ISDN_NET_ENCAP_CISCOHDLCK, &ciscohdlck_ops); -#ifdef CONFIG_ISDN_X25 - register_isdn_netif(ISDN_NET_ENCAP_X25IFACE, &isdn_x25_ops); -#endif -#ifdef CONFIG_ISDN_PPP - register_isdn_netif(ISDN_NET_ENCAP_SYNCPPP, &isdn_ppp_ops); -#endif -} - -void -isdn_net_exit(void) -{ - isdn_net_lib_exit(); -} - diff --git a/drivers/isdn/i4l/isdn_net.h b/drivers/isdn/i4l/isdn_net.h index 1f4933dd0f7a..049f2aa3059c 100644 --- a/drivers/isdn/i4l/isdn_net.h +++ b/drivers/isdn/i4l/isdn_net.h @@ -9,76 +9,7 @@ * of the GNU General Public License, incorporated herein by reference. */ -#include -#include -#include - -void isdn_net_init(void); -void isdn_net_exit(void); -void isdn_net_lib_init(void); -void isdn_net_lib_exit(void); -void isdn_net_hangup_all(void); -int isdn_net_ioctl(struct inode *, struct file *, uint, ulong); - -int register_isdn_netif(int encap, struct isdn_netif_ops *ops); -int isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev); -void isdn_net_online(isdn_net_dev *idev); -void isdn_net_offline(isdn_net_dev *idev); - -int isdn_net_stat_callback(int, isdn_ctrl *); -int isdn_net_find_icall(int, int, int, setup_parm *); -int isdn_net_rcv_skb(int, struct sk_buff *); - -int isdn_net_hangup(isdn_net_dev *); -int isdn_net_dial_req(isdn_net_dev *); -void isdn_net_writebuf_skb(isdn_net_dev *, struct sk_buff *skb); -void isdn_net_write_super(isdn_net_dev *, struct sk_buff *skb); -int isdn_net_autodial(struct sk_buff *skb, struct net_device *ndev); -isdn_net_dev *isdn_net_get_xmit_dev(isdn_net_local *mlp); -void isdn_netif_rx(isdn_net_dev *idev, struct sk_buff *skb, u16 protocol); - -/* ====================================================================== */ - -static inline int -put_u8(unsigned char *p, u8 x) -{ - *p = x; - return 1; -} - -static inline int -put_u16(unsigned char *p, u16 x) -{ - *((u16 *)p) = htons(x); - return 2; -} - -static inline int -put_u32(unsigned char *p, u32 x) -{ - *((u32 *)p) = htonl(x); - return 4; -} - -static inline int -get_u8(unsigned char *p, u8 *x) -{ - *x = *p; - return 1; -} - -static inline int -get_u16(unsigned char *p, u16 *x) -{ - *x = ntohs(*((u16 *)p)); - return 2; -} - -static inline int -get_u32(unsigned char *p, u32 *x) -{ - *x = ntohl(*((u32 *)p)); - return 4; -} - - +extern struct isdn_netif_ops isdn_iptyp_ops; +extern struct isdn_netif_ops isdn_uihdlc_ops; +extern struct isdn_netif_ops isdn_rawip_ops; +extern struct isdn_netif_ops isdn_ether_ops; diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c index 8bc24804a21d..cf8d99d18f93 100644 --- a/drivers/isdn/i4l/isdn_net_lib.c +++ b/drivers/isdn/i4l/isdn_net_lib.c @@ -1,4 +1,4 @@ -/* Linux ISDN subsystem, Network interface configuration +/* Linux ISDN subsystem, network interface support code * * Copyright 1994-1998 by Fritz Elfert (fritz@isdn4linux.de) * 1995,96 by Thinking Objects Software GmbH Wuerzburg @@ -54,8 +54,10 @@ #include #include #include "isdn_common.h" +#include "isdn_net_lib.h" #include "isdn_net.h" #include "isdn_ppp.h" +#include "isdn_ciscohdlck.h" #define ISDN_NET_TX_TIMEOUT (20*HZ) @@ -2335,12 +2337,25 @@ void isdn_net_lib_init(void) { fsm_new(&isdn_net_fsm); + + register_isdn_netif(ISDN_NET_ENCAP_ETHER, &isdn_ether_ops); + register_isdn_netif(ISDN_NET_ENCAP_RAWIP, &isdn_rawip_ops); + register_isdn_netif(ISDN_NET_ENCAP_IPTYP, &isdn_iptyp_ops); + register_isdn_netif(ISDN_NET_ENCAP_UIHDLC, &isdn_uihdlc_ops); + register_isdn_netif(ISDN_NET_ENCAP_CISCOHDLC, &isdn_ciscohdlck_ops); + register_isdn_netif(ISDN_NET_ENCAP_CISCOHDLCK, &isdn_ciscohdlck_ops); +#ifdef CONFIG_ISDN_X25 + register_isdn_netif(ISDN_NET_ENCAP_X25IFACE, &isdn_x25_ops); +#endif +#ifdef CONFIG_ISDN_PPP + register_isdn_netif(ISDN_NET_ENCAP_SYNCPPP, &isdn_ppp_ops); +#endif } void isdn_net_lib_exit(void) { - isdn_net_cleanup(); + fsm_free(&isdn_net_fsm); } diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index 0e41f64b2608..27094f60851b 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c @@ -15,11 +15,11 @@ #include #include "isdn_common.h" +#include "isdn_net_lib.h" #include "isdn_ppp.h" #include "isdn_ppp_ccp.h" #include "isdn_ppp_vj.h" #include "isdn_ppp_mp.h" -#include "isdn_net.h" /* ====================================================================== */ diff --git a/drivers/isdn/i4l/isdn_ppp_ccp.c b/drivers/isdn/i4l/isdn_ppp_ccp.c index 2e51d4a54b4e..5a8f2dc7e01b 100644 --- a/drivers/isdn/i4l/isdn_ppp_ccp.c +++ b/drivers/isdn/i4l/isdn_ppp_ccp.c @@ -11,7 +11,7 @@ #include "isdn_ppp_ccp.h" #include "isdn_common.h" -#include "isdn_net.h" +#include "isdn_net_lib.h" #include "isdn_ppp.h" #include diff --git a/drivers/isdn/i4l/isdn_ppp_mp.c b/drivers/isdn/i4l/isdn_ppp_mp.c index 3f18fe370dc9..995e209eafb2 100644 --- a/drivers/isdn/i4l/isdn_ppp_mp.c +++ b/drivers/isdn/i4l/isdn_ppp_mp.c @@ -12,7 +12,7 @@ #include "isdn_ppp_mp.h" #include "isdn_ppp_ccp.h" #include "isdn_common.h" -#include "isdn_net.h" +#include "isdn_net_lib.h" #include "isdn_ppp.h" /* ====================================================================== */ diff --git a/drivers/isdn/i4l/isdn_ppp_vj.c b/drivers/isdn/i4l/isdn_ppp_vj.c index ef97182b5800..648d4480fe9c 100644 --- a/drivers/isdn/i4l/isdn_ppp_vj.c +++ b/drivers/isdn/i4l/isdn_ppp_vj.c @@ -9,7 +9,7 @@ #include "isdn_ppp_vj.h" #include "isdn_common.h" -#include "isdn_net.h" +#include "isdn_net_lib.h" #include "isdn_ppp.h" struct slcompress * diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 5055fbe6b687..f58b3f83966d 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -278,37 +278,6 @@ struct isdn_net_phone { which holds the linux device structure (here: isdn_net_device) */ -struct isdn_net_dev_s; -struct isdn_net_local_s; - -struct isdn_netif_ops { - int (*hard_start_xmit) (struct sk_buff *skb, - struct net_device *dev); - int (*hard_header) (struct sk_buff *skb, - struct net_device *dev, - unsigned short type, - void *daddr, - void *saddr, - unsigned len); - int (*do_ioctl)(struct net_device *dev, - struct ifreq *ifr, int cmd); - - unsigned short flags; /* interface flags (a la BSD) */ - unsigned short type; /* interface hardware type */ - unsigned char addr_len;/* hardware address length */ - void (*receive)(struct isdn_net_local_s *, - struct isdn_net_dev_s *, - struct sk_buff *); - void (*connected)(struct isdn_net_dev_s *); - void (*disconnected)(struct isdn_net_dev_s *); - int (*bind)(struct isdn_net_dev_s *); - void (*unbind)(struct isdn_net_dev_s *); - int (*init)(struct isdn_net_local_s *); - void (*cleanup)(struct isdn_net_local_s *); - int (*open)(struct isdn_net_local_s *); - void (*close)(struct isdn_net_local_s *); -}; - typedef struct { unsigned long seqerrs; unsigned long frame_drops; -- cgit v1.2.3 From aa799cfeddf35db910eb2165f1d672dcba2258c9 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:28:28 -0600 Subject: ISDN: Move isdn_net_lib specific definitions out of linux/isdn.h isdn_net_dev and isdn_net_local logically are used by isdn_net_lib, so let's move them there. --- drivers/isdn/i4l/isdn_common.c | 12 ++-- drivers/isdn/i4l/isdn_common.h | 4 +- drivers/isdn/i4l/isdn_ppp.h | 3 +- drivers/isdn/i4l/isdn_ppp_mp.h | 3 +- drivers/isdn/i4l/isdn_ppp_vj.h | 4 +- include/linux/isdn.h | 136 ----------------------------------------- 6 files changed, 11 insertions(+), 151 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index ac4ab500a97d..7a42eadb6fff 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -44,7 +44,7 @@ struct isdn_slot { unsigned long obytes; /* Statistics outgoing bytes */ struct isdn_v110 iv110; /* For V.110 */ int m_idx; /* Index for mdm.... */ - isdn_net_dev *idev; /* pointer to isdn_net_dev */ + isdn_net_dev *priv; /* pointer to isdn_net_dev */ }; static struct isdn_slot slot[ISDN_MAX_CHANNELS]; @@ -2023,19 +2023,19 @@ isdn_slot_num(int sl) } void -isdn_slot_set_idev(int sl, isdn_net_dev *idev) +isdn_slot_set_priv(int sl, void *priv) { BUG_ON(sl < 0); - slot[sl].idev = idev; + slot[sl].priv = priv; } -isdn_net_dev * -isdn_slot_idev(int sl) +void * +isdn_slot_priv(int sl) { BUG_ON(sl < 0); - return slot[sl].idev; + return slot[sl].priv; } int diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index e059ead2cc0c..5aa1e5f71728 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -96,6 +96,6 @@ extern void isdn_slot_set_usage(int slot, int usage); extern char *isdn_slot_num(int slot); extern int isdn_slot_m_idx(int slot); extern void isdn_slot_set_m_idx(int slot, int midx); -extern void isdn_slot_set_idev(int sl, isdn_net_dev *); -extern isdn_net_dev *isdn_slot_idev(int sl); +extern void isdn_slot_set_priv(int sl, void *); +extern void *isdn_slot_priv(int sl); extern int isdn_hard_header_len(void); diff --git a/drivers/isdn/i4l/isdn_ppp.h b/drivers/isdn/i4l/isdn_ppp.h index df63397a8acb..00996432ad15 100644 --- a/drivers/isdn/i4l/isdn_ppp.h +++ b/drivers/isdn/i4l/isdn_ppp.h @@ -7,8 +7,7 @@ * of the GNU General Public License, incorporated herein by reference. */ -#include /* for PPP_PROTOCOL */ -#include /* for isdn_ppp info */ +#include "isdn_net_lib.h" extern struct file_operations isdn_ppp_fops; extern struct isdn_netif_ops isdn_ppp_ops; diff --git a/drivers/isdn/i4l/isdn_ppp_mp.h b/drivers/isdn/i4l/isdn_ppp_mp.h index 4eacffc728ef..e684edebcd07 100644 --- a/drivers/isdn/i4l/isdn_ppp_mp.h +++ b/drivers/isdn/i4l/isdn_ppp_mp.h @@ -12,8 +12,7 @@ #ifndef __ISDN_PPP_MP_H__ #define __ISDN_PPP_MP_H__ -#include -#include +#include "isdn_net_lib.h" #ifdef CONFIG_ISDN_MPP diff --git a/drivers/isdn/i4l/isdn_ppp_vj.h b/drivers/isdn/i4l/isdn_ppp_vj.h index 1af3ca9049e2..e1fdeac199b7 100644 --- a/drivers/isdn/i4l/isdn_ppp_vj.h +++ b/drivers/isdn/i4l/isdn_ppp_vj.h @@ -10,9 +10,7 @@ #ifndef __ISDN_PPP_VJ_H__ #define __ISDN_PPP_VJ_H__ -#include -#include - +#include "isdn_net_lib.h" #ifdef CONFIG_ISDN_PPP_VJ diff --git a/include/linux/isdn.h b/include/linux/isdn.h index f58b3f83966d..61ce8db1d46d 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -278,142 +278,6 @@ struct isdn_net_phone { which holds the linux device structure (here: isdn_net_device) */ -typedef struct { - unsigned long seqerrs; - unsigned long frame_drops; - unsigned long overflows; - unsigned long max_queue_len; -} isdn_mppp_stats; - -/* Local interface-data */ -typedef struct isdn_net_local_s { - ulong magic; - struct net_device_stats stats; /* Ethernet Statistics */ - int flags; /* Connection-flags */ - int dialmax; /* Max. Number of Dial-retries */ - int dialtimeout; /* How long shall we try on dialing */ - int dialwait; /* wait after failed attempt */ - - int cbdelay; /* Delay before Callback starts */ - char msn[ISDN_MSNLEN]; /* MSNs/EAZs for this interface */ - - u_char cbhup; /* Flag: Reject Call before Callback*/ - int hupflags; /* Flags for charge-unit-hangup: */ - int onhtime; /* Time to keep link up */ - - u_char p_encap; /* Packet encapsulation */ - u_char l2_proto; /* Layer-2-protocol */ - u_char l3_proto; /* Layer-3-protocol */ - - ulong slavedelay; /* Dynamic bundling delaytime */ - int triggercps; /* BogoCPS needed for trigger slave */ - struct list_head phone[2]; /* List of remote-phonenumbers */ - /* phone[0] = Incoming Numbers */ - /* phone[1] = Outgoing Numbers */ - - struct list_head slaves; /* list of all bundled channels - protected by serializing config - ioctls / no change allowed when - interface is running */ - struct list_head online; /* list of all bundled channels - which can be used for actual - data (IP) transfer - protected by xmit_lock */ - - spinlock_t xmit_lock; /* used to protect the xmit path of - a net_device, including all - associated channels's frame_cnt */ - struct list_head running_devs; /* member of global running_devs */ - atomic_t refcnt; /* references held by ISDN code */ - -#ifdef CONFIG_ISDN_X25 - struct concap_device_ops *dops; /* callbacks used by encapsulator */ -#endif -#ifdef CONFIG_ISDN_PPP - unsigned int mp_cfg; - u32 mp_txseq; - struct sk_buff_head mp_frags; /* fragments sl list */ - u32 mp_rxseq; /* last processed packet seq #: any - packets with smaller seq # will - be dropped unconditionally */ - struct ippp_ccp *ccp; - unsigned long debug; -#ifdef CONFIG_ISDN_PPP_VJ - unsigned char *cbuf; - struct slcompress *slcomp; -#endif -#endif - - /* use an own struct for that in later versions */ - ulong cisco_myseq; /* Local keepalive seq. for Cisco */ - ulong cisco_mineseen; /* returned keepalive seq. from remote */ - ulong cisco_yourseq; /* Remote keepalive seq. for Cisco */ - int cisco_keepalive_period; /* keepalive period */ - ulong cisco_last_slarp_in; /* jiffie of last keepalive packet we received */ - char cisco_line_state; /* state of line according to keepalive packets */ - char cisco_debserint; /* debugging flag of cisco hdlc with slarp */ - - struct timer_list cisco_timer; - - struct isdn_netif_ops *ops; - - struct net_device dev; /* interface to upper levels */ -} isdn_net_local; - -/* the interface itself */ -typedef struct isdn_net_dev_s { - int isdn_slot; /* Index to isdn device/channel */ - int pre_device; /* Preselected isdn-device */ - int pre_channel; /* Preselected isdn-channel */ - int exclusive; /* -1 if non excl./idx to excl chan */ - - struct timer_list dial_timer; /* dial events timer */ - struct fsm_inst fi; /* call control state machine */ - int dial_event; /* event in case of timer expiry */ - int dial; /* # of phone number just dialed */ - int outgoing; /* Flag: outgoing call */ - int dialretry; /* Counter for Dialout-retries */ - - int cps; /* current speed of this interface */ - int transcount; /* byte-counter for cps-calculation */ - int last_jiffies; /* when transcount was reset */ - int sqfull; /* Flag: netdev-queue overloaded */ - ulong sqfull_stamp; /* Start-Time of overload */ - - int huptimer; /* Timeout-counter for auto-hangup */ - int charge; /* Counter for charging units */ - int charge_state; /* ChargeInfo state machine */ - unsigned long chargetime; /* Timer for Charging info */ - int chargeint; /* Interval between charge-infos */ - - int pppbind; /* ippp device for bindings */ - struct ipppd *ipppd; /* /dev/ipppX which controls us */ - - struct sk_buff_head super_tx_queue; /* List of supervisory frames to */ - /* be transmitted asap */ - int frame_cnt; /* number of frames currently */ - /* queued in HL driver */ - struct tasklet_struct tlet; - - isdn_net_local *mlp; /* Ptr to master device for all devs*/ - - struct list_head slaves; /* member of local->slaves */ - struct list_head online; /* member of local->online */ - - char name[10]; /* Name of device */ - struct list_head global_list; /* global list of all isdn_net_devs */ -#ifdef CONFIG_ISDN_PPP - unsigned int pppcfg; - u32 mp_rxseq; /* last seq no seen on this channel */ - struct ippp_ccp *ccp; - unsigned long debug; -#endif -#ifdef CONFIG_ISDN_X25 - struct concap_proto *cprot; /* connection oriented encapsulation protocol */ -#endif - -} isdn_net_dev; - /*===================== End of ip-over-ISDN stuff ===========================*/ /*======================= Start of ISDN-tty stuff ===========================*/ -- cgit v1.2.3 From e7288954a5b40b1260a09c21c183679ebab40a5c Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:30:13 -0600 Subject: ISDN: alloc CISCO HDLC info dynamically There's really no need to allocate private storage for all possible interface types, just leave it to the interface type to alloc the memory it needs. CISCO HDLC does that, now. --- drivers/isdn/i4l/isdn_ciscohdlck.c | 123 ++++++++++++++++++++++--------------- drivers/isdn/i4l/isdn_ciscohdlck.h | 11 ++++ drivers/isdn/i4l/isdn_net_lib.h | 37 +++++++---- include/linux/isdn.h | 27 -------- 4 files changed, 109 insertions(+), 89 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.c b/drivers/isdn/i4l/isdn_ciscohdlck.c index 669dc1c7bb93..e2a0c7541197 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.c +++ b/drivers/isdn/i4l/isdn_ciscohdlck.c @@ -55,6 +55,7 @@ static int isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { isdn_net_local *mlp = dev->priv; + struct inl_cisco *cisco = mlp->inl_priv; unsigned long len = 0; int period; char debserint; @@ -66,13 +67,13 @@ isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) switch (cmd) { /* get/set keepalive period */ case SIOCGKEEPPERIOD: - len = sizeof(mlp->cisco_keepalive_period); + len = sizeof(cisco->keepalive_period); if (copy_to_user((char *)ifr->ifr_ifru.ifru_data, - (char *)&mlp->cisco_keepalive_period, len)) + (char *)&cisco->keepalive_period, len)) rc = -EFAULT; break; case SIOCSKEEPPERIOD: - len = sizeof(mlp->cisco_keepalive_period); + len = sizeof(cisco->keepalive_period); if (copy_from_user((char *)&period, (char *)ifr->ifr_ifru.ifru_data, len)) { rc = -EFAULT; @@ -82,21 +83,21 @@ isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) rc = -EINVAL; break; } - mod_timer(&mlp->cisco_timer, jiffies + period * HZ); + mod_timer(&cisco->timer, jiffies + period * HZ); printk(KERN_INFO "%s: Keepalive period set " "to %d seconds.\n", dev->name, period); - mlp->cisco_keepalive_period = period; + cisco->keepalive_period = period; break; /* get/set debugging */ case SIOCGDEBSERINT: - len = sizeof(mlp->cisco_debserint); + len = sizeof(cisco->debserint); if (copy_to_user((char *)ifr->ifr_ifru.ifru_data, - (char *)&mlp->cisco_debserint, len)) + (char *)&cisco->debserint, len)) rc = -EFAULT; break; case SIOCSDEBSERINT: - len = sizeof(mlp->cisco_debserint); + len = sizeof(cisco->debserint); if (copy_from_user((char *)&debserint, (char *)ifr->ifr_ifru.ifru_data, len)) { rc = -EFAULT; @@ -106,7 +107,7 @@ isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) rc = -EINVAL; break; } - mlp->cisco_debserint = debserint; + cisco->debserint = debserint; break; default: @@ -121,10 +122,11 @@ static void isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data) { isdn_net_local *mlp = (isdn_net_local *) data; - isdn_net_dev *idev; + isdn_net_dev *idev; + struct inl_cisco *cisco = mlp->inl_priv; struct sk_buff *skb; unsigned char *p; - unsigned long last_cisco_myseq = mlp->cisco_myseq; + unsigned long last_cisco_myseq = cisco->myseq; int myseq_diff = 0; if (list_empty(&mlp->online)) { @@ -132,33 +134,33 @@ isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data) return; } idev = list_entry(mlp->online.next, isdn_net_dev, online); - mlp->cisco_myseq++; + cisco->myseq++; - myseq_diff = (mlp->cisco_myseq - mlp->cisco_mineseen); - if (mlp->cisco_line_state && (myseq_diff >= 3 || myseq_diff <= -3)) { + myseq_diff = cisco->myseq - cisco->mineseen; + if (cisco->line_state && (myseq_diff >= 3 || myseq_diff <= -3)) { /* line up -> down */ - mlp->cisco_line_state = 0; + cisco->line_state = 0; printk (KERN_WARNING "UPDOWN: Line protocol on Interface %s," " changed state to down\n", idev->name); /* should stop routing higher-level data accross */ - } else if (!mlp->cisco_line_state && + } else if (!cisco->line_state && myseq_diff >= 0 && myseq_diff <= 2) { /* line down -> up */ - mlp->cisco_line_state = 1; + cisco->line_state = 1; printk (KERN_WARNING "UPDOWN: Line protocol on Interface %s," " changed state to up\n", idev->name); /* restart routing higher-level data accross */ } - if (mlp->cisco_debserint) + if (cisco->debserint) printk (KERN_DEBUG "%s: HDLC " - "myseq %lu, mineseen %lu%c, yourseen %lu, %s\n", - idev->name, last_cisco_myseq, mlp->cisco_mineseen, - (last_cisco_myseq == mlp->cisco_mineseen) ? '*' : 040, - mlp->cisco_yourseq, - (mlp->cisco_line_state) ? "line up" : "line down"); + "myseq %u, mineseen %u%c, yourseen %u, %s\n", + idev->name, cisco->myseq, cisco->mineseen, + (last_cisco_myseq == cisco->mineseen) ? '*' : 040, + cisco->yourseq, + (cisco->line_state) ? "line up" : "line down"); skb = isdn_net_ciscohdlck_alloc_skb(idev, 4 + 14); if (!skb) @@ -173,13 +175,13 @@ isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data) /* slarp keepalive */ p += put_u32(p, CISCO_SLARP_KEEPALIVE); - p += put_u32(p, mlp->cisco_myseq); - p += put_u32(p, mlp->cisco_yourseq); + p += put_u32(p, cisco->myseq); + p += put_u32(p, cisco->yourseq); p += put_u16(p, 0xffff); // reliablity, always 0xffff isdn_net_write_super(idev, skb); - mod_timer(&mlp->cisco_timer, jiffies + mlp->cisco_keepalive_period * HZ); + mod_timer(&cisco->timer, jiffies + cisco->keepalive_period * HZ); } static void @@ -219,24 +221,25 @@ static void isdn_ciscohdlck_connected(isdn_net_dev *idev) { isdn_net_local *lp = idev->mlp; + struct inl_cisco *cisco = lp->inl_priv; - lp->cisco_myseq = 0; - lp->cisco_mineseen = 0; - lp->cisco_yourseq = 0; - lp->cisco_keepalive_period = ISDN_TIMER_KEEPINT; - lp->cisco_last_slarp_in = 0; - lp->cisco_line_state = 0; - lp->cisco_debserint = 0; + cisco->myseq = 0; + cisco->mineseen = 0; + cisco->yourseq = 0; + cisco->keepalive_period = ISDN_TIMER_KEEPINT; + cisco->last_slarp_in = 0; + cisco->line_state = 0; + cisco->debserint = 0; if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK) { /* send slarp request because interface/seq.no.s reset */ isdn_net_ciscohdlck_slarp_send_request(lp); - init_timer(&lp->cisco_timer); - lp->cisco_timer.data = (unsigned long) lp; - lp->cisco_timer.function = isdn_net_ciscohdlck_slarp_send_keepalive; - lp->cisco_timer.expires = jiffies + lp->cisco_keepalive_period * HZ; - add_timer(&lp->cisco_timer); + init_timer(&cisco->timer); + cisco->timer.data = (unsigned long) lp; + cisco->timer.function = isdn_net_ciscohdlck_slarp_send_keepalive; + cisco->timer.expires = jiffies + cisco->keepalive_period * HZ; + add_timer(&cisco->timer); } netif_wake_queue(&lp->dev); } @@ -245,9 +248,10 @@ static void isdn_ciscohdlck_disconnected(isdn_net_dev *idev) { isdn_net_local *lp = idev->mlp; + struct inl_cisco *cisco = lp->inl_priv; if (lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK) { - del_timer(&lp->cisco_timer); + del_timer(&cisco->timer); } } @@ -295,6 +299,7 @@ static void isdn_net_ciscohdlck_slarp_in(isdn_net_dev *idev, struct sk_buff *skb) { isdn_net_local *mlp = idev->mlp; + struct inl_cisco *cisco = mlp->inl_priv; unsigned char *p; int period; u32 code; @@ -311,7 +316,7 @@ isdn_net_ciscohdlck_slarp_in(isdn_net_dev *idev, struct sk_buff *skb) switch (code) { case CISCO_SLARP_REQUEST: - mlp->cisco_yourseq = 0; + cisco->yourseq = 0; isdn_net_ciscohdlck_slarp_send_reply(idev); break; case CISCO_SLARP_REPLY: @@ -338,21 +343,20 @@ isdn_net_ciscohdlck_slarp_in(isdn_net_dev *idev, struct sk_buff *skb) HIPQUAD(addr), HIPQUAD(mask)); break; case CISCO_SLARP_KEEPALIVE: - period = (int)((jiffies - mlp->cisco_last_slarp_in - + HZ/2 - 1) / HZ); - if (mlp->cisco_debserint && - (period != mlp->cisco_keepalive_period) && - mlp->cisco_last_slarp_in) { + period = (jiffies - cisco->last_slarp_in + HZ/2 - 1) / HZ; + if (cisco->debserint && + (period != cisco->keepalive_period) && + cisco->last_slarp_in) { printk(KERN_DEBUG "%s: Keepalive period mismatch - " "is %d but should be %d.\n", - idev->name, period, mlp->cisco_keepalive_period); + idev->name, period, cisco->keepalive_period); } - mlp->cisco_last_slarp_in = jiffies; + cisco->last_slarp_in = jiffies; p += get_u32(p, &my_seq); p += get_u32(p, &your_seq); p += get_u16(p, &unused); - mlp->cisco_yourseq = my_seq; - mlp->cisco_mineseen = your_seq; + cisco->yourseq = my_seq; + cisco->mineseen = your_seq; break; } } @@ -361,6 +365,7 @@ static void isdn_ciscohdlck_receive(isdn_net_local *lp, isdn_net_dev *idev, struct sk_buff *skb) { + struct inl_cisco *cisco = lp->inl_priv; unsigned char *p; u8 addr; u8 ctrl; @@ -387,7 +392,7 @@ isdn_ciscohdlck_receive(isdn_net_local *lp, isdn_net_dev *idev, isdn_net_ciscohdlck_slarp_in(idev, skb); goto out_free; case CISCO_TYPE_CDP: - if (lp->cisco_debserint) + if (cisco->debserint) printk(KERN_DEBUG "%s: Received CDP packet. use " "\"no cdp enable\" on cisco.\n", idev->name); goto out_free; @@ -417,6 +422,22 @@ isdn_ciscohdlck_header(struct sk_buff *skb, struct net_device *dev, return 4; } +static int +isdn_ciscohdlck_open(isdn_net_local *lp) +{ + lp->inl_priv = kmalloc(sizeof(struct inl_cisco), GFP_KERNEL); + if (!lp->inl_priv) + return -ENOMEM; + + return 0; +} + +static void +isdn_ciscohdlck_close(isdn_net_local *lp) +{ + kfree(lp->inl_priv); +} + struct isdn_netif_ops isdn_ciscohdlck_ops = { .hard_start_xmit = isdn_net_start_xmit, .hard_header = isdn_ciscohdlck_header, @@ -426,4 +447,6 @@ struct isdn_netif_ops isdn_ciscohdlck_ops = { .receive = isdn_ciscohdlck_receive, .connected = isdn_ciscohdlck_connected, .disconnected = isdn_ciscohdlck_disconnected, + .open = isdn_ciscohdlck_open, + .close = isdn_ciscohdlck_close, }; diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.h b/drivers/isdn/i4l/isdn_ciscohdlck.h index c9cebdaf5395..dda0d7a07744 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.h +++ b/drivers/isdn/i4l/isdn_ciscohdlck.h @@ -12,4 +12,15 @@ extern struct isdn_netif_ops isdn_ciscohdlck_ops; +struct inl_cisco { + u32 myseq; /* local keepalive seq. for Cisco */ + u32 mineseen; /* returned keepalive seq. from remote */ + u32 yourseq; /* remote keepalive seq. for Cisco */ + int keepalive_period; /* keepalive period */ + int last_slarp_in; /* jiffie of last recvd keepalive pkt */ + char line_state; /* state of line */ + char debserint; /* debugging flags */ + struct timer_list timer; +}; + #endif diff --git a/drivers/isdn/i4l/isdn_net_lib.h b/drivers/isdn/i4l/isdn_net_lib.h index e45da8224fe2..92ef9e8395a1 100644 --- a/drivers/isdn/i4l/isdn_net_lib.h +++ b/drivers/isdn/i4l/isdn_net_lib.h @@ -69,6 +69,29 @@ int register_isdn_netif(int encap, struct isdn_netif_ops *ops); /* ====================================================================== */ +/* Feature- and status-flags for a net-interface */ +#define ISDN_NET_SECURE 0x02 /* Accept calls from phonelist only */ +#define ISDN_NET_CALLBACK 0x04 /* activate callback */ +#define ISDN_NET_CBHUP 0x08 /* hangup before callback */ +#define ISDN_NET_CBOUT 0x10 /* remote machine does callback */ + +#define ISDN_NET_MAGIC 0x49344C02 /* for paranoia-checking */ + +/* Phone-list-element */ +struct isdn_net_phone { + struct list_head list; + char num[ISDN_MSNLEN]; +}; + +/* + Principles when extending structures for generic encapsulation protocol + ("concap") support: + - Stuff which is hardware specific (here i4l-specific) goes in + the netdev -> local structure (here: isdn_net_local) + - Stuff which is encapsulation protocol specific goes in the structure + which holds the linux device structure (here: isdn_net_device) +*/ + /* per network interface data (dev->priv) */ struct isdn_net_local_s { @@ -128,18 +151,8 @@ struct isdn_net_local_s { struct slcompress *slcomp; #endif #endif - - /* use an own struct for that in later versions */ - ulong cisco_myseq; /* Local keepalive seq. for Cisco */ - ulong cisco_mineseen; /* returned keepalive seq. from remote */ - ulong cisco_yourseq; /* Remote keepalive seq. for Cisco */ - int cisco_keepalive_period; /* keepalive period */ - ulong cisco_last_slarp_in; /* jiffie of last keepalive packet we received */ - char cisco_line_state; /* state of line according to keepalive packets */ - char cisco_debserint; /* debugging flag of cisco hdlc with slarp */ - - struct timer_list cisco_timer; - + void *inl_priv; /* interface types can put their + private data here */ struct isdn_netif_ops *ops; struct net_device dev; /* interface to upper levels */ diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 61ce8db1d46d..8a1afe26f172 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -253,33 +253,6 @@ typedef struct { /* GLOBAL_FLAGS */ #define ISDN_GLOBAL_STOPPED 1 -/*=================== Start of ip-over-ISDN stuff =========================*/ - -/* Feature- and status-flags for a net-interface */ -#define ISDN_NET_SECURE 0x02 /* Accept calls from phonelist only */ -#define ISDN_NET_CALLBACK 0x04 /* activate callback */ -#define ISDN_NET_CBHUP 0x08 /* hangup before callback */ -#define ISDN_NET_CBOUT 0x10 /* remote machine does callback */ - -#define ISDN_NET_MAGIC 0x49344C02 /* for paranoia-checking */ - -/* Phone-list-element */ -struct isdn_net_phone { - struct list_head list; - char num[ISDN_MSNLEN]; -}; - -/* - Principles when extending structures for generic encapsulation protocol - ("concap") support: - - Stuff which is hardware specific (here i4l-specific) goes in - the netdev -> local structure (here: isdn_net_local) - - Stuff which is encapsulation protocol specific goes in the structure - which holds the linux device structure (here: isdn_net_device) -*/ - -/*===================== End of ip-over-ISDN stuff ===========================*/ - /*======================= Start of ISDN-tty stuff ===========================*/ #define ISDN_ASYNC_MAGIC 0x49344C01 /* for paranoia-checking */ -- cgit v1.2.3 From 6afb7be2ae6ea38a72d13ad3b76742800f55ec18 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:34:03 -0600 Subject: ISDN: Remove rcv_waitq/snd_waitq The arrays were only allocated and initialized, never used. --- drivers/isdn/i4l/isdn_audio.c | 2 -- drivers/isdn/i4l/isdn_common.c | 29 +++-------------------------- include/linux/isdn.h | 2 -- 3 files changed, 3 insertions(+), 30 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_audio.c b/drivers/isdn/i4l/isdn_audio.c index 2602dfc059a4..a2c4c7883eaf 100644 --- a/drivers/isdn/i4l/isdn_audio.c +++ b/drivers/isdn/i4l/isdn_audio.c @@ -570,7 +570,6 @@ isdn_audio_eval_dtmf(modem_info * info) /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); - wake_up_interruptible(&dev->drv[di]->rcv_waitq[ch]); } else kfree_skb(skb); s->last = what; @@ -691,7 +690,6 @@ isdn_audio_put_dle_code(modem_info * info, u_char code) /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); - wake_up_interruptible(&dev->drv[di]->rcv_waitq[ch]); } void diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 7a42eadb6fff..f49de99aa06a 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -319,12 +319,9 @@ isdn_receive_skb_callback(int di, int channel, struct sk_buff *skb) } /* No network-device found, deliver to tty or raw-channel */ - if (skb->len) { - if (isdn_tty_rcv_skb(i, di, channel, skb)) - return; - wake_up_interruptible(&dev->drv[di]->rcv_waitq[channel]); - } else - dev_kfree_skb(skb); + if (isdn_tty_rcv_skb(i, di, channel, skb)) + return; + dev_kfree_skb(skb); } /* @@ -436,7 +433,6 @@ isdn_status_callback(isdn_ctrl * c) return 0; if (isdn_tty_stat_callback(i, c)) return 0; - wake_up_interruptible(&dev->drv[di]->snd_waitq[c->arg]); break; case ISDN_STAT_STAVAIL: save_flags(flags); @@ -658,7 +654,6 @@ isdn_status_callback(isdn_ctrl * c) for (i = 0; i < dev->drv[di]->channels; i++) skb_queue_purge(&dev->drv[di]->rpqueue[i]); kfree(dev->drv[di]->rpqueue); - kfree(dev->drv[di]->rcv_waitq); kfree(dev->drv[di]); dev->drv[di] = NULL; dev->drvid[di][0] = '\0'; @@ -1701,24 +1696,6 @@ isdn_add_channels(driver *d, int drvidx, int n, int adding) skb_queue_head_init(&d->rpqueue[j]); } - if ((adding) && (d->rcv_waitq)) - kfree(d->rcv_waitq); - d->rcv_waitq = kmalloc(sizeof(wait_queue_head_t) * 2 * m, GFP_KERNEL); - if (!d->rcv_waitq) { - printk(KERN_WARNING "register_isdn: Could not alloc rcv_waitq\n"); - if (!adding) { - kfree(d->rpqueue); - kfree(d->rcvcount); - kfree(d->rcverr); - } - return -1; - } - d->snd_waitq = d->rcv_waitq + m; - for (j = 0; j < m; j++) { - init_waitqueue_head(&d->rcv_waitq[j]); - init_waitqueue_head(&d->snd_waitq[j]); - } - dev->channels += n; save_flags(flags); cli(); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 8a1afe26f172..8ce00dae9a84 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -434,8 +434,6 @@ typedef struct { unsigned long DLEflag; /* Flags: Insert DLE at next read */ #endif struct sk_buff_head *rpqueue; /* Pointers to start of Rcv-Queue */ - wait_queue_head_t *rcv_waitq; /* Wait-Queues for B-Channel-Reads */ - wait_queue_head_t *snd_waitq; /* Wait-Queue for B-Channel-Send's */ char msn2eaz[10][ISDN_MSNLEN]; /* Mapping-Table MSN->EAZ */ } driver; -- cgit v1.2.3 From 96d1d0390e22e154f54336f8a9ac17c135cec619 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:36:36 -0600 Subject: ISDN: Make array of drivers private to isdn_common.c Currently, we need to provide a couple of helper functions to avoid breaking isdn_tty with this change, as that gets cleaned up, the need for those helpers should vanish as well. --- drivers/isdn/i4l/isdn_audio.c | 6 +- drivers/isdn/i4l/isdn_common.c | 214 ++++++++++++++++++++++++++--------------- drivers/isdn/i4l/isdn_common.h | 7 +- drivers/isdn/i4l/isdn_tty.c | 19 ++-- drivers/isdn/i4l/isdn_v110.c | 9 +- include/linux/isdn.h | 25 ----- 6 files changed, 159 insertions(+), 121 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_audio.c b/drivers/isdn/i4l/isdn_audio.c index a2c4c7883eaf..8e618de64e79 100644 --- a/drivers/isdn/i4l/isdn_audio.c +++ b/drivers/isdn/i4l/isdn_audio.c @@ -564,8 +564,7 @@ isdn_audio_eval_dtmf(modem_info * info) cli(); di = isdn_slot_driver(info->isdn_slot); ch = isdn_slot_channel(info->isdn_slot); - __skb_queue_tail(&dev->drv[di]->rpqueue[ch], skb); - dev->drv[di]->rcvcount[ch] += 2; + isdn_drv_queue_tail(di, ch, skb, 2); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) @@ -684,8 +683,7 @@ isdn_audio_put_dle_code(modem_info * info, u_char code) cli(); di = isdn_slot_driver(info->isdn_slot); ch = isdn_slot_channel(info->isdn_slot); - __skb_queue_tail(&dev->drv[di]->rpqueue[ch], skb); - dev->drv[di]->rcvcount[ch] += 2; + isdn_drv_queue_tail(di, ch, skb, 2); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 147b52d05ffb..f42497d38fbc 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -49,6 +49,69 @@ struct isdn_slot { static struct isdn_slot slot[ISDN_MAX_CHANNELS]; +/* ====================================================================== */ + +#define DRV_FLAG_RUNNING 1 +#define DRV_FLAG_REJBUS 2 +#define DRV_FLAG_LOADED 4 + +/* Description of hardware-level-driver */ +struct isdn_driver { + unsigned long online; /* Channel Online flags */ + unsigned long flags; /* Misc driver Flags */ + int locks; /* Number of locks */ + int channels; /* Number of channels */ + wait_queue_head_t st_waitq; /* Wait-Queue for status-reads */ + int maxbufsize; /* Maximum Buffersize supported*/ + int stavail; /* Chars avail on Status-device*/ + isdn_if *interface; /* Interface to driver */ + int *rcverr; /* Error-counters for B rx */ + int *rcvcount; /* Byte-counters for B rx */ +#ifdef CONFIG_ISDN_AUDIO + unsigned long DLEflag; /* Insert DLE at next read */ +#endif + struct sk_buff_head *rpqueue; /* Pointers to rx queue */ + char msn2eaz[10][ISDN_MSNLEN]; /* MSN->EAZ */ + struct fsm_inst fi; +} driver; + +struct isdn_driver *drivers[ISDN_MAX_DRIVERS]; + +int +isdn_drv_queue_empty(int di, int ch) +{ + return skb_queue_empty(&drivers[di]->rpqueue[ch]); +} + +void +isdn_drv_queue_tail(int di, int ch, struct sk_buff *skb, int len) +{ + __skb_queue_tail(&drivers[di]->rpqueue[ch], skb); + drivers[di]->rcvcount[ch] += len; +} + +int +isdn_drv_maxbufsize(int di) +{ + return drivers[di]->maxbufsize; +} + +int +isdn_drv_writebuf_skb(int di, int ch, int x, struct sk_buff *skb) +{ + return drivers[di]->interface->writebuf_skb(di, ch, 1, skb); +} + +int +isdn_drv_hdrlen(int di) +{ + return drivers[di]->interface->hl_hdrlen; +} + +static int isdn_add_channels(struct isdn_driver *, int, int, int); + +/* ====================================================================== */ + #if defined(CONFIG_ISDN_DIVERSION) || defined(CONFIG_ISDN_DIVERSION_MODULE) static isdn_divert_if *divert_if; /* = NULL */ #else @@ -75,7 +138,7 @@ isdn_lock_drivers(void) cmd.arg = 0; cmd.command = ISDN_CMD_LOCK; isdn_command(&cmd); - dev->drv[i]->locks++; + drivers[i]->locks++; } } @@ -92,14 +155,14 @@ isdn_unlock_drivers(void) int i; for (i = 0; i < dev->drivers; i++) - if (dev->drv[i]->locks > 0) { + if (drivers[i]->locks > 0) { isdn_ctrl cmd; cmd.driver = i; cmd.arg = 0; cmd.command = ISDN_CMD_UNLOCK; isdn_command(&cmd); - dev->drv[i]->locks--; + drivers[i]->locks--; } } @@ -342,7 +405,7 @@ isdn_command(isdn_ctrl *cmd) } if (cmd->command == ISDN_CMD_SETL2) { unsigned long l2prot = (cmd->arg >> 8) & 255; - unsigned long features = (dev->drv[cmd->driver]->interface->features + unsigned long features = (drivers[cmd->driver]->interface->features >> ISDN_FEATURE_L2_SHIFT) & ISDN_FEATURE_L2_MASK; unsigned long l2_feature = (1 << l2prot); @@ -389,7 +452,7 @@ isdn_command(isdn_ctrl *cmd) printk(KERN_DEBUG "%s: cmd = %d\n", __FUNCTION__, cmd->command); } #endif - return dev->drv[cmd->driver]->interface->command(cmd); + return drivers[cmd->driver]->interface->command(cmd); } /* @@ -441,19 +504,19 @@ isdn_status_callback(isdn_ctrl * c) break; case ISDN_STAT_STAVAIL: spin_lock_irqsave(&stat_lock, flags); - dev->drv[di]->stavail += c->arg; + drivers[di]->stavail += c->arg; spin_unlock_irqrestore(&stat_lock, flags); - wake_up_interruptible(&dev->drv[di]->st_waitq); + wake_up_interruptible(&drivers[di]->st_waitq); break; case ISDN_STAT_RUN: - dev->drv[di]->flags |= DRV_FLAG_RUNNING; + drivers[di]->flags |= DRV_FLAG_RUNNING; for (i = 0; i < ISDN_MAX_CHANNELS; i++) if (slot[i].di == di) isdn_slot_all_eaz(i); set_global_features(); break; case ISDN_STAT_STOP: - dev->drv[di]->flags &= ~DRV_FLAG_RUNNING; + drivers[di]->flags &= ~DRV_FLAG_RUNNING; break; case ISDN_STAT_ICALL: if (i < 0) @@ -476,7 +539,7 @@ isdn_status_callback(isdn_ctrl * c) if (divert_if) if ((retval = divert_if->stat_callback(c))) return(retval); /* processed */ - if ((!retval) && (dev->drv[di]->flags & DRV_FLAG_REJBUS)) { + if ((!retval) && (drivers[di]->flags & DRV_FLAG_REJBUS)) { /* No tty responding */ cmd.driver = di; cmd.arg = c->arg; @@ -565,7 +628,7 @@ isdn_status_callback(isdn_ctrl * c) if (i < 0) return -1; dbg_statcallb("DHUP: %d\n", i); - dev->drv[di]->online &= ~(1 << (c->arg)); + drivers[di]->online &= ~(1 << (c->arg)); isdn_info_update(); /* Signal hangup to network-devices */ if (isdn_net_stat_callback(i, c)) @@ -581,7 +644,7 @@ isdn_status_callback(isdn_ctrl * c) return -1; dbg_statcallb("BCONN: %ld\n", c->arg); /* Signal B-channel-connect to network-devices */ - dev->drv[di]->online |= (1 << (c->arg)); + drivers[di]->online |= (1 << (c->arg)); isdn_info_update(); if (isdn_net_stat_callback(i, c)) break; @@ -593,7 +656,7 @@ isdn_status_callback(isdn_ctrl * c) if (i < 0) return -1; dbg_statcallb("BHUP: %d\n", i); - dev->drv[di]->online &= ~(1 << (c->arg)); + drivers[di]->online &= ~(1 << (c->arg)); isdn_info_update(); /* Signal hangup to network-devices */ if (isdn_net_stat_callback(i, c)) @@ -612,7 +675,7 @@ isdn_status_callback(isdn_ctrl * c) break; break; case ISDN_STAT_ADDCH: - if (isdn_add_channels(dev->drv[di], di, c->arg, 1)) + if (isdn_add_channels(drivers[di], di, c->arg, 1)) return -1; isdn_info_update(); break; @@ -633,13 +696,13 @@ isdn_status_callback(isdn_ctrl * c) restore_flags(flags); break; case ISDN_STAT_UNLOAD: - while (dev->drv[di]->locks > 0) { + while (drivers[di]->locks > 0) { isdn_ctrl cmd; cmd.driver = di; cmd.arg = 0; cmd.command = ISDN_CMD_UNLOCK; isdn_command(&cmd); - dev->drv[di]->locks--; + drivers[di]->locks--; } save_flags(flags); cli(); @@ -652,14 +715,14 @@ isdn_status_callback(isdn_ctrl * c) isdn_unregister_devfs(i); } dev->drivers--; - dev->channels -= dev->drv[di]->channels; - kfree(dev->drv[di]->rcverr); - kfree(dev->drv[di]->rcvcount); - for (i = 0; i < dev->drv[di]->channels; i++) - skb_queue_purge(&dev->drv[di]->rpqueue[i]); - kfree(dev->drv[di]->rpqueue); - kfree(dev->drv[di]); - dev->drv[di] = NULL; + dev->channels -= drivers[di]->channels; + kfree(drivers[di]->rcverr); + kfree(drivers[di]->rcvcount); + for (i = 0; i < drivers[di]->channels; i++) + skb_queue_purge(&drivers[di]->rpqueue[i]); + kfree(drivers[di]->rpqueue); + kfree(drivers[di]); + drivers[di] = NULL; dev->drvid[di][0] = '\0'; isdn_info_update(); set_global_features(); @@ -720,23 +783,23 @@ isdn_slot_readbchan(int sl, u_char * buf, u_char * fp, int len) struct sk_buff *skb; u_char *cp; - if (!dev->drv[di]) + if (!drivers[di]) return 0; - if (skb_queue_empty(&dev->drv[di]->rpqueue[ch])) + if (skb_queue_empty(&drivers[di]->rpqueue[ch])) return 0; - if (len > dev->drv[di]->rcvcount[ch]) - len = dev->drv[di]->rcvcount[ch]; + if (len > drivers[di]->rcvcount[ch]) + len = drivers[di]->rcvcount[ch]; cp = buf; count = 0; while (len) { - if (!(skb = skb_peek(&dev->drv[di]->rpqueue[ch]))) + if (!(skb = skb_peek(&drivers[di]->rpqueue[ch]))) break; #ifdef CONFIG_ISDN_AUDIO if (ISDN_AUDIO_SKB_LOCK(skb)) break; ISDN_AUDIO_SKB_LOCK(skb) = 1; - if ((ISDN_AUDIO_SKB_DLECOUNT(skb)) || (dev->drv[di]->DLEflag & (1 << ch))) { + if ((ISDN_AUDIO_SKB_DLECOUNT(skb)) || (drivers[di]->DLEflag & (1 << ch))) { char *p = skb->data; unsigned long DLEmask = (1 << ch); @@ -744,13 +807,13 @@ isdn_slot_readbchan(int sl, u_char * buf, u_char * fp, int len) count_pull = count_put = 0; while ((count_pull < skb->len) && (len > 0)) { len--; - if (dev->drv[di]->DLEflag & DLEmask) { + if (drivers[di]->DLEflag & DLEmask) { *cp++ = DLE; - dev->drv[di]->DLEflag &= ~DLEmask; + drivers[di]->DLEflag &= ~DLEmask; } else { *cp++ = *p; if (*p == DLE) { - dev->drv[di]->DLEflag |= DLEmask; + drivers[di]->DLEflag |= DLEmask; (ISDN_AUDIO_SKB_DLECOUNT(skb))--; } p++; @@ -789,7 +852,7 @@ isdn_slot_readbchan(int sl, u_char * buf, u_char * fp, int len) #ifdef CONFIG_ISDN_AUDIO ISDN_AUDIO_SKB_LOCK(skb) = 0; #endif - skb = skb_dequeue(&dev->drv[di]->rpqueue[ch]); + skb = skb_dequeue(&drivers[di]->rpqueue[ch]); dev_kfree_skb(skb); } else { /* Not yet emptied this buff, so it @@ -801,7 +864,7 @@ isdn_slot_readbchan(int sl, u_char * buf, u_char * fp, int len) ISDN_AUDIO_SKB_LOCK(skb) = 0; #endif } - dev->drv[di]->rcvcount[ch] -= count_put; + drivers[di]->rcvcount[ch] -= count_put; } return count; } @@ -852,8 +915,8 @@ isdn_statstr(void) sprintf(p, "\nflags:\t"); p = istatbuf + strlen(istatbuf); for (i = 0; i < ISDN_MAX_DRIVERS; i++) { - if (dev->drv[i]) { - sprintf(p, "%ld ", dev->drv[i]->online); + if (drivers[i]) { + sprintf(p, "%ld ", drivers[i]->online); p = istatbuf + strlen(istatbuf); } else { sprintf(p, "? "); @@ -1090,14 +1153,14 @@ isdn_ctrl_read(struct file *file, char *buf, size_t count, loff_t * off) isdn_BUG(); return -ENODEV; } - if (!dev->drv[drvidx]->interface->readstat) { + if (!drivers[drvidx]->interface->readstat) { isdn_BUG(); return 0; } - add_wait_queue(&dev->drv[drvidx]->st_waitq, &wait); + add_wait_queue(&drivers[drvidx]->st_waitq, &wait); for (;;) { spin_lock_irqsave(&stat_lock, flags); - len = dev->drv[drvidx]->stavail; + len = drivers[drvidx]->stavail; spin_unlock_irqrestore(&stat_lock, flags); if (len > 0) break; @@ -1112,7 +1175,7 @@ isdn_ctrl_read(struct file *file, char *buf, size_t count, loff_t * off) schedule(); } __set_current_state(TASK_RUNNING); - remove_wait_queue(&dev->drv[drvidx]->st_waitq, &wait); + remove_wait_queue(&drivers[drvidx]->st_waitq, &wait); if (len < 0) return len; @@ -1120,15 +1183,15 @@ isdn_ctrl_read(struct file *file, char *buf, size_t count, loff_t * off) if (count > len) count = len; - len = dev->drv[drvidx]->interface->readstat(buf, count, 1, drvidx, - isdn_minor2chan(minor)); + len = drivers[drvidx]->interface->readstat(buf, count, 1, drvidx, + isdn_minor2chan(minor)); spin_lock_irqsave(&stat_lock, flags); if (len) { - dev->drv[drvidx]->stavail -= len; + drivers[drvidx]->stavail -= len; } else { isdn_BUG(); - dev->drv[drvidx]->stavail = 0; + drivers[drvidx]->stavail = 0; } spin_unlock_irqrestore(&stat_lock, flags); @@ -1151,11 +1214,11 @@ isdn_ctrl_write(struct file *file, const char *buf, size_t count, loff_t *off) retval = -ENODEV; goto out; } - if (!dev->drv[drvidx]->interface->writecmd) { + if (!drivers[drvidx]->interface->writecmd) { retval = -EINVAL; goto out; } - retval = dev->drv[drvidx]->interface-> + retval = drivers[drvidx]->interface-> writecmd(buf, count, 1, drvidx, isdn_minor2chan(minor - ISDN_MINOR_CTRL)); out: @@ -1174,9 +1237,9 @@ isdn_ctrl_poll(struct file *file, poll_table *wait) /* driver deregistered while file open */ return POLLHUP; - poll_wait(file, &(dev->drv[drvidx]->st_waitq), wait); + poll_wait(file, &drivers[drvidx]->st_waitq, wait); mask = POLLOUT | POLLWRNORM; - if (dev->drv[drvidx]->stavail) + if (drivers[drvidx]->stavail) mask |= POLLIN | POLLRDNORM; return mask; @@ -1255,9 +1318,9 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) if (drvidx == -1) return -ENODEV; if (iocts.arg) - dev->drv[drvidx]->flags |= DRV_FLAG_REJBUS; + drivers[drvidx]->flags |= DRV_FLAG_REJBUS; else - dev->drv[drvidx]->flags &= ~DRV_FLAG_REJBUS; + drivers[drvidx]->flags &= ~DRV_FLAG_REJBUS; return 0; case IIOCSIGPRF: dev->profd = current; @@ -1355,7 +1418,7 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) /* Fall through */ case ',': bname[j] = '\0'; - strcpy(dev->drv[drvidx]->msn2eaz[i], bname); + strcpy(drivers[drvidx]->msn2eaz[i], bname); j = ISDN_MSNLEN; break; default: @@ -1371,8 +1434,8 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) p = (char *) iocts.arg; for (i = 0; i < 10; i++) { sprintf(bname, "%s%s", - strlen(dev->drv[drvidx]->msn2eaz[i]) ? - dev->drv[drvidx]->msn2eaz[i] : "_", + strlen(drivers[drvidx]->msn2eaz[i]) ? + drivers[drvidx]->msn2eaz[i] : "_", (i < 9) ? "," : "\0"); if (copy_to_user(p, bname, strlen(bname) + 1)) return -EFAULT; @@ -1494,7 +1557,7 @@ static struct file_operations isdn_fops = char * isdn_map_eaz2msn(char *msn, int di) { - driver *this = dev->drv[di]; + struct isdn_driver *this = drivers[di]; int i; if (strlen(msn) == 1) { @@ -1538,11 +1601,11 @@ isdn_get_free_slot(int usage, int l2_proto, int l3_proto, continue; if (slot[i].usage & ISDN_USAGE_DISABLED) continue; /* usage not allowed */ - if (!dev->drv[d]->flags & DRV_FLAG_RUNNING) + if (!drivers[d]->flags & DRV_FLAG_RUNNING) continue; - if (((dev->drv[d]->interface->features & features) == features) || - (((dev->drv[d]->interface->features & vfeatures) == vfeatures) && - (dev->drv[d]->interface->features & ISDN_FEATURE_L2_TRANS))) { + if (((drivers[d]->interface->features & features) == features) || + (((drivers[d]->interface->features & vfeatures) == vfeatures) && + (drivers[d]->interface->features & ISDN_FEATURE_L2_TRANS))) { if (pre_dev < 0 || pre_chan < 0 || (pre_dev == d && pre_chan == slot[i].ch)) { isdn_slot_set_usage(i, usage); @@ -1584,7 +1647,7 @@ isdn_slot_free(int sl) slot[sl].iv110.v110 = NULL; // 20.10.99 JIM, try to reinitialize v110 ! isdn_slot_set_usage(sl, ISDN_USAGE_NONE); - skb_queue_purge(&dev->drv[isdn_slot_driver(sl)]->rpqueue[isdn_slot_channel(sl)]); + skb_queue_purge(&drivers[isdn_slot_driver(sl)]->rpqueue[isdn_slot_channel(sl)]); restore_flags(flags); } @@ -1615,7 +1678,7 @@ isdn_slot_write(int sl, struct sk_buff *skb) return v110_ret; } /* V.110 must always be acknowledged */ - ret = dev->drv[di]->interface->writebuf_skb(di, ch, 1, nskb); + ret = drivers[di]->interface->writebuf_skb(di, ch, 1, nskb); } else { int hl = isdn_slot_hdrlen(sl); @@ -1633,14 +1696,14 @@ isdn_slot_write(int sl, struct sk_buff *skb) skb_tmp = skb_realloc_headroom(skb, hl); printk(KERN_DEBUG "isdn_writebuf_skb_stub: reallocating headroom%s\n", skb_tmp ? "" : " failed"); if (!skb_tmp) return -ENOMEM; /* 0 better? */ - ret = dev->drv[di]->interface->writebuf_skb(di, ch, 1, skb_tmp); + ret = drivers[di]->interface->writebuf_skb(di, ch, 1, skb_tmp); if( ret > 0 ){ dev_kfree_skb(skb); } else { dev_kfree_skb(skb_tmp); } } else { - ret = dev->drv[di]->interface->writebuf_skb(di, ch, 1, skb); + ret = drivers[di]->interface->writebuf_skb(di, ch, 1, skb); } } if (ret > 0) { @@ -1662,8 +1725,8 @@ isdn_slot_write(int sl, struct sk_buff *skb) return ret; } -int -isdn_add_channels(driver *d, int drvidx, int n, int adding) +static int +isdn_add_channels(struct isdn_driver *d, int drvidx, int n, int adding) { int j, k, m; ulong flags; @@ -1742,10 +1805,10 @@ set_global_features(void) dev->global_features = 0; for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) { - if (!dev->drv[drvidx]) + if (!drivers[drvidx]) continue; - if (dev->drv[drvidx]->interface) - dev->global_features |= dev->drv[drvidx]->interface->features; + if (drivers[drvidx]->interface) + dev->global_features |= drivers[drvidx]->interface->features; } } @@ -1810,7 +1873,7 @@ EXPORT_SYMBOL(isdn_ppp_unregister_compressor); int register_isdn(isdn_if * i) { - driver *d; + struct isdn_driver *d; int j; ulong flags; int drvidx; @@ -1831,14 +1894,13 @@ register_isdn(isdn_if * i) memset((char *) d, 0, sizeof(driver)); d->maxbufsize = i->maxbufsize; - d->pktcount = 0; d->stavail = 0; d->flags = DRV_FLAG_LOADED; d->online = 0; d->interface = i; d->channels = 0; for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) - if (!dev->drv[drvidx]) + if (!drivers[drvidx]) break; if (isdn_add_channels(d, drvidx, i->channels, 0)) { kfree(d); @@ -1854,7 +1916,7 @@ register_isdn(isdn_if * i) for (j = 0; j < drvidx; j++) if (!strcmp(i->id, dev->drvid[j])) sprintf(i->id, "line%d", drvidx); - dev->drv[drvidx] = d; + drivers[drvidx] = d; strcpy(dev->drvid[drvidx], i->id); isdn_info_update(); dev->drivers++; @@ -1884,7 +1946,7 @@ isdn_slot_hdrlen(int sl) { int di = isdn_slot_driver(sl); - return dev->drv[di]->interface->hl_hdrlen; + return drivers[di]->interface->hl_hdrlen; } char * @@ -2041,9 +2103,9 @@ isdn_hard_header_len(void) int max = 0; for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) { - if (dev->drv[drvidx] && - max < dev->drv[drvidx]->interface->hl_hdrlen) { - max = dev->drv[drvidx]->interface->hl_hdrlen; + if (drivers[drvidx] && + max < drivers[drvidx]->interface->hl_hdrlen) { + max = drivers[drvidx]->interface->hl_hdrlen; } } return max; diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index 5aa1e5f71728..ee9d125e592c 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -63,7 +63,6 @@ extern char *isdn_map_eaz2msn(char *msn, int di); extern void isdn_timer_ctrl(int tf, int onoff); extern int isdn_getnum(char **); extern int isdn_msncmp( const char *, const char *); -extern int isdn_add_channels(driver *, int, int, int); #if defined(ISDN_DEBUG_NET_DUMP) || defined(ISDN_DEBUG_MODEM_DUMP) extern void isdn_dumppkt(char *, u_char *, int, int); #else @@ -99,3 +98,9 @@ extern void isdn_slot_set_m_idx(int slot, int midx); extern void isdn_slot_set_priv(int sl, void *); extern void *isdn_slot_priv(int sl); extern int isdn_hard_header_len(void); + +int isdn_drv_queue_empty(int di, int ch); +void isdn_drv_queue_tail(int di, int ch, struct sk_buff *skb, int len); +int isdn_drv_maxbufsize(int di); +int isdn_drv_writebuf_skb(int di, int ch, int x, struct sk_buff *skb); +int isdn_drv_hdrlen(int di); diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index a565d3787e2e..8789f5e83137 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -264,7 +264,7 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb) /* Try to deliver directly via tty-flip-buf if queue is empty */ save_flags(flags); cli(); - if (skb_queue_empty(&dev->drv[di]->rpqueue[channel])) + if (isdn_drv_queue_empty(di, channel)) if (isdn_tty_try_read(info, skb)) { restore_flags(flags); return 1; @@ -272,13 +272,11 @@ isdn_tty_rcv_skb(int i, int di, int channel, struct sk_buff *skb) /* Direct deliver failed or queue wasn't empty. * Queue up for later dequeueing via timer-irq. */ - __skb_queue_tail(&dev->drv[di]->rpqueue[channel], skb); - dev->drv[di]->rcvcount[channel] += - (skb->len + isdn_drv_queue_tail(di, channel, skb, skb->len #ifdef CONFIG_ISDN_AUDIO + ISDN_AUDIO_SKB_DLECOUNT(skb) #endif - ); + ); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) @@ -1109,8 +1107,8 @@ isdn_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int co if (c > info->xmit_size - info->xmit_count) c = info->xmit_size - info->xmit_count; di = isdn_slot_driver(info->isdn_slot); - if (di >= 0 && c > dev->drv[di]->maxbufsize) - c = dev->drv[di]->maxbufsize; + if (di >= 0 && c > isdn_drv_maxbufsize(di)) + c = isdn_drv_maxbufsize(di); if (c <= 0) break; if ((info->online > 1) @@ -2211,7 +2209,7 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup) } restore_flags(flags); printk(KERN_INFO "isdn_tty: call from %s -> %s %s\n", nr, eaz, - ((dev->drv[di]->flags & DRV_FLAG_REJBUS) && (wret != 2))? "rejected" : "ignored"); + (wret != 2)? "rejected" : "ignored"); return (wret == 2)?3:0; } @@ -2441,7 +2439,7 @@ isdn_tty_at_cout(char *msg, modem_info * info) /* data is in queue or flip buffer is full */ di = isdn_slot_driver(info->isdn_slot); ch = isdn_slot_channel(info->isdn_slot); if ((info->online) && (((tty->flip.count + strlen(msg)) >= TTY_FLIPBUF_SIZE) || - (!skb_queue_empty(&dev->drv[di]->rpqueue[ch])))) { + (!isdn_drv_queue_empty(di, ch)))) { skb = alloc_skb(strlen(msg) #ifdef CONFIG_ISDN_AUDIO + sizeof(isdn_audio_skb) @@ -2484,8 +2482,7 @@ isdn_tty_at_cout(char *msg, modem_info * info) } } if (skb) { - __skb_queue_tail(&dev->drv[di]->rpqueue[ch], skb); - dev->drv[di]->rcvcount[ch] += skb->len; + isdn_drv_queue_tail(di, ch, skb, skb->len); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) diff --git a/drivers/isdn/i4l/isdn_v110.c b/drivers/isdn/i4l/isdn_v110.c index ae4b28229904..81470cd6cfdd 100644 --- a/drivers/isdn/i4l/isdn_v110.c +++ b/drivers/isdn/i4l/isdn_v110.c @@ -13,6 +13,7 @@ #include #include "isdn_v110.h" +#include "isdn_common.h" #undef ISDN_V110_DEBUG @@ -542,7 +543,7 @@ isdn_v110_stat_callback(struct isdn_v110 *iv110, isdn_ctrl *c) else skb = isdn_v110_idle(v); if (skb) { - if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) { + if (isdn_drv_writebuf_skb(c->driver, c->arg, 1, skb) <= 0) { dev_kfree_skb(skb); break; } else { @@ -569,8 +570,8 @@ isdn_v110_stat_callback(struct isdn_v110 *iv110, isdn_ctrl *c) break; case ISDN_STAT_BCONN: if (iv110->v110emu && (iv110->v110 == NULL)) { - int hdrlen = dev->drv[c->driver]->interface->hl_hdrlen; - int maxsize = dev->drv[c->driver]->interface->maxbufsize; + int hdrlen = isdn_drv_hdrlen(c->driver); + int maxsize = isdn_drv_maxbufsize(c->driver); atomic_inc(&iv110->v110use); switch (iv110->v110emu) { case ISDN_PROTO_L2_V11096: @@ -587,7 +588,7 @@ isdn_v110_stat_callback(struct isdn_v110 *iv110, isdn_ctrl *c) if ((v = iv110->v110)) { while (v->SyncInit) { struct sk_buff *skb = isdn_v110_sync(v); - if (dev->drv[c->driver]->interface->writebuf_skb(c->driver, c->arg, 1, skb) <= 0) { + if (isdn_drv_writebuf_skb(c->driver, c->arg, 1, skb) <= 0) { dev_kfree_skb(skb); /* Unable to send, try later */ break; diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 8ce00dae9a84..6b0af2383fdb 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -413,30 +413,6 @@ typedef struct { char *private; } infostruct; -#define DRV_FLAG_RUNNING 1 -#define DRV_FLAG_REJBUS 2 -#define DRV_FLAG_LOADED 4 - -/* Description of hardware-level-driver */ -typedef struct { - ulong online; /* Channel-Online flags */ - ulong flags; /* Misc driver Flags */ - int locks; /* Number of locks for this driver */ - int channels; /* Number of channels */ - wait_queue_head_t st_waitq; /* Wait-Queue for status-read's */ - int maxbufsize; /* Maximum Buffersize supported */ - unsigned long pktcount; /* Until now: unused */ - int stavail; /* Chars avail on Status-device */ - isdn_if *interface; /* Interface to driver */ - int *rcverr; /* Error-counters for B-Ch.-receive */ - int *rcvcount; /* Byte-counters for B-Ch.-receive */ -#ifdef CONFIG_ISDN_AUDIO - unsigned long DLEflag; /* Flags: Insert DLE at next read */ -#endif - struct sk_buff_head *rpqueue; /* Pointers to start of Rcv-Queue */ - char msn2eaz[10][ISDN_MSNLEN]; /* Mapping-Table MSN->EAZ */ -} driver; - /* Main driver-data */ typedef struct isdn_devt { unsigned short flags; /* Bitmapped Flags: */ @@ -451,7 +427,6 @@ typedef struct isdn_devt { infostruct *infochain; /* List of open info-devs. */ wait_queue_head_t info_waitq; /* Wait-Queue for isdninfo */ struct timer_list timer; /* Misc.-function Timer */ - driver *drv[ISDN_MAX_DRIVERS]; /* Array of drivers */ char drvid[ISDN_MAX_DRIVERS][20];/* Driver-ID */ struct task_struct *profd; /* For iprofd */ modem mdm; /* tty-driver-data */ -- cgit v1.2.3 From dbc67c41077ed29cdb182ef0c12c0199434b245e Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:38:28 -0600 Subject: ISDN: Get rid of global drivers count It's useless information, we need to iterate over all potential drivers anyway, since possibly the first one has unregistered before the second, leaving a hole. --- drivers/isdn/i4l/isdn_common.c | 67 ++++++++++++++++++++++++------------------ include/linux/isdn.h | 1 - 2 files changed, 39 insertions(+), 29 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 72f54e837ef3..9ce6b2af541b 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -114,10 +114,29 @@ static void isdn_receive_skb_callback(int di, int ch, struct sk_buff *skb); static int isdn_status_callback(isdn_ctrl * c); static void set_global_features(void); +/* + * Helper keeping track of the features the drivers support + */ +static void +set_global_features(void) +{ + unsigned long flags; + int drvidx; + + dev->global_features = 0; + spin_lock_irqsave(&drivers_lock, flags); + for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) { + if (!drivers[drvidx]) + continue; + if (drivers[drvidx]->interface) + dev->global_features |= drivers[drvidx]->interface->features; + } + spin_unlock_irqrestore(&drivers_lock, flags); +} + /* * Register a new ISDN interface */ - int register_isdn(isdn_if *iif) { @@ -125,12 +144,6 @@ register_isdn(isdn_if *iif) unsigned long flags; int drvidx; - if (dev->drivers >= ISDN_MAX_DRIVERS) { - printk(KERN_WARNING "register_isdn: Max. %d drivers supported\n", - ISDN_MAX_DRIVERS); - goto fail; - } - drv = kmalloc(sizeof(*drv), GFP_KERNEL); if (!drv) { printk(KERN_WARNING "register_isdn: out of mem\n"); @@ -150,6 +163,9 @@ register_isdn(isdn_if *iif) if (!drivers[drvidx]) break; + if (drvidx == ISDN_MAX_DRIVERS) + goto fail_unlock; + if (!strlen(iif->id)) sprintf(iif->id, "line%d", drvidx); @@ -170,7 +186,6 @@ register_isdn(isdn_if *iif) iif->statcallb = isdn_status_callback; isdn_info_update(); - dev->drivers++; set_global_features(); return 1; @@ -200,10 +215,14 @@ static int isdn_command(isdn_ctrl *cmd); void isdn_lock_drivers(void) { + isdn_ctrl cmd; + unsigned long flags; int i; - for (i = 0; i < dev->drivers; i++) { - isdn_ctrl cmd; + spin_lock_irqsave(&drivers_lock, flags); + for (i = 0; i < ISDN_MAX_DRIVERS; i++) { + if (!drivers[i]) + continue; cmd.driver = i; cmd.arg = 0; @@ -211,6 +230,7 @@ isdn_lock_drivers(void) isdn_command(&cmd); drivers[i]->locks++; } + spin_unlock_irqrestore(&drivers_lock, flags); } void @@ -223,18 +243,24 @@ isdn_MOD_INC_USE_COUNT(void) void isdn_unlock_drivers(void) { + isdn_ctrl cmd; + unsigned long flags; int i; - for (i = 0; i < dev->drivers; i++) - if (drivers[i]->locks > 0) { - isdn_ctrl cmd; + spin_lock_irqsave(&drivers_lock, flags); + for (i = 0; i < ISDN_MAX_DRIVERS; i++) { + if (!drivers[i]) + continue; + if (drivers[i]->locks > 0) { cmd.driver = i; cmd.arg = 0; cmd.command = ISDN_CMD_UNLOCK; isdn_command(&cmd); drivers[i]->locks--; } + } + spin_unlock_irqrestore(&drivers_lock, flags); } void @@ -785,7 +811,6 @@ isdn_status_callback(isdn_ctrl * c) slot[i].usage &= ~ISDN_USAGE_DISABLED; isdn_unregister_devfs(i); } - dev->drivers--; dev->channels -= drivers[di]->channels; kfree(drivers[di]->rcverr); kfree(drivers[di]->rcvcount); @@ -1869,20 +1894,6 @@ isdn_add_channels(struct isdn_driver *d, int drvidx, int n, int adding) * Low-level-driver registration */ -static void -set_global_features(void) -{ - int drvidx; - - dev->global_features = 0; - for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) { - if (!drivers[drvidx]) - continue; - if (drivers[drvidx]->interface) - dev->global_features |= drivers[drvidx]->interface->features; - } -} - #if defined(CONFIG_ISDN_DIVERSION) || defined(CONFIG_ISDN_DIVERSION_MODULE) static char *map_drvname(int di) diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 6b0af2383fdb..1f71bd37a4db 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -417,7 +417,6 @@ typedef struct { typedef struct isdn_devt { unsigned short flags; /* Bitmapped Flags: */ /* */ - int drivers; /* Current number of drivers */ int channels; /* Current number of channels */ int net_verbose; /* Verbose-Flag */ int modempoll; /* Flag: tty-read active */ -- cgit v1.2.3 From 83a64b2637e4fcda267663df85986f4d47dae4fb Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:39:24 -0600 Subject: ISDN: Kill drvid[] array We know the driver ids via drivers[]->interface->id already, no need to keep them around a second time. --- drivers/isdn/i4l/isdn_common.c | 80 +++++++++++++++++++++++------------------- drivers/isdn/i4l/isdn_common.h | 12 ++++--- include/linux/isdn.h | 1 - 3 files changed, 50 insertions(+), 43 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 9ce6b2af541b..6f7b9c11ad7d 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -109,6 +109,42 @@ isdn_drv_hdrlen(int di) return drivers[di]->interface->hl_hdrlen; } +int +__isdn_drv_lookup(char *drvid) +{ + int drvidx; + + for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) { + if (!drivers[drvidx]) + continue; + + if (strcmp(drivers[drvidx]->interface->id, drvid) == 0) + return drvidx; + } + return -1; +} + +int +isdn_drv_lookup(char *drvid) +{ + unsigned long flags; + int drvidx; + + spin_lock_irqsave(&drivers_lock, flags); + drvidx = __isdn_drv_lookup(drvid); + spin_unlock_irqrestore(&drivers_lock, flags); + return drvidx; +} + +char *isdn_drv_drvid(int di) +{ + if (!drivers[di]) { + isdn_BUG(); + return ""; + } + return drivers[di]->interface->id; +} + static int isdn_add_channels(struct isdn_driver *, int, int, int); static void isdn_receive_skb_callback(int di, int ch, struct sk_buff *skb); static int isdn_status_callback(isdn_ctrl * c); @@ -169,11 +205,8 @@ register_isdn(isdn_if *iif) if (!strlen(iif->id)) sprintf(iif->id, "line%d", drvidx); - strcpy(dev->drvid[drvidx], iif->id); - - for (drvidx = 0; drvidx < ISDN_MAX_DRIVERS; drvidx++) - if (strcmp(iif->id, dev->drvid[drvidx]) == 0) - goto fail_unlock; + if (__isdn_drv_lookup(iif->id) >= 0) + goto fail_unlock; if (isdn_add_channels(drv, drvidx, iif->channels, 0)) goto fail_unlock; @@ -693,7 +726,7 @@ isdn_status_callback(isdn_ctrl * c) case ISDN_STAT_CAUSE: dbg_statcallb("CAUSE: %d %s\n", i, c->parm.num); printk(KERN_INFO "isdn: %s,ch%ld cause: %s\n", - dev->drvid[di], c->arg, c->parm.num); + isdn_drv_drvid(di), c->arg, c->parm.num); isdn_tty_stat_callback(i, c); if (divert_if) divert_if->stat_callback(c); @@ -819,7 +852,6 @@ isdn_status_callback(isdn_ctrl * c) kfree(drivers[di]->rpqueue); kfree(drivers[di]); drivers[di] = NULL; - dev->drvid[di][0] = '\0'; isdn_info_update(); set_global_features(); restore_flags(flags); @@ -987,7 +1019,7 @@ isdn_statstr(void) sprintf(istatbuf, "idmap:\t"); p = istatbuf + strlen(istatbuf); for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - sprintf(p, "%s ", (slot[i].di < 0) ? "-" : dev->drvid[slot[i].di]); + sprintf(p, "%s ", (slot[i].di < 0) ? "-" : isdn_drv_drvid(slot[i].di)); p = istatbuf + strlen(istatbuf); } sprintf(p, "\nchmap:\t"); @@ -1395,7 +1427,6 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) case IIOCSETBRJ: drvidx = -1; if (arg) { - int i; char *p; if (copy_from_user((char *) &iocts, (char *) arg, sizeof(isdn_ioctl_struct))) @@ -1403,12 +1434,7 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) if (strlen(iocts.drvid)) { if ((p = strchr(iocts.drvid, ','))) *p = 0; - drvidx = -1; - for (i = 0; i < ISDN_MAX_DRIVERS; i++) - if (!(strcmp(dev->drvid[i], iocts.drvid))) { - drvidx = i; - break; - } + drvidx = isdn_drv_lookup(iocts.drvid); } } if (drvidx == -1) @@ -1485,15 +1511,7 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) (char *) arg, sizeof(isdn_ioctl_struct))) return -EFAULT; - if (strlen(iocts.drvid)) { - drvidx = -1; - for (i = 0; i < ISDN_MAX_DRIVERS; i++) - if (!(strcmp(dev->drvid[i], iocts.drvid))) { - drvidx = i; - break; - } - } else - drvidx = 0; + drvidx = isdn_drv_lookup(iocts.drvid); if (drvidx == -1) return -ENODEV; if (cmd == IIOCSETMAP) { @@ -1555,21 +1573,9 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) else return -EINVAL; if (arg) { - int i; - char *p; if (copy_from_user((char *) &iocts, (char *) arg, sizeof(isdn_ioctl_struct))) return -EFAULT; - if (strlen(iocts.drvid)) { - if ((p = strchr(iocts.drvid, ','))) - *p = 0; - drvidx = -1; - for (i = 0; i < ISDN_MAX_DRIVERS; i++) - if (!(strcmp(dev->drvid[i], iocts.drvid))) { - drvidx = i; - break; - } - } else - drvidx = 0; + drvidx = isdn_drv_lookup(iocts.drvid); if (drvidx == -1) return -ENODEV; if ((ret = verify_area(VERIFY_WRITE, (void *) arg, diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index ee9d125e592c..96aab20198f9 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -99,8 +99,10 @@ extern void isdn_slot_set_priv(int sl, void *); extern void *isdn_slot_priv(int sl); extern int isdn_hard_header_len(void); -int isdn_drv_queue_empty(int di, int ch); -void isdn_drv_queue_tail(int di, int ch, struct sk_buff *skb, int len); -int isdn_drv_maxbufsize(int di); -int isdn_drv_writebuf_skb(int di, int ch, int x, struct sk_buff *skb); -int isdn_drv_hdrlen(int di); +int isdn_drv_queue_empty(int di, int ch); +void isdn_drv_queue_tail(int di, int ch, struct sk_buff *skb, int len); +int isdn_drv_maxbufsize(int di); +int isdn_drv_writebuf_skb(int di, int ch, int x, struct sk_buff *skb); +int isdn_drv_hdrlen(int di); +int isdn_drv_lookup(char *drvid); +char *isdn_drv_drvid(int di); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 1f71bd37a4db..ded1aad43e4c 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -426,7 +426,6 @@ typedef struct isdn_devt { infostruct *infochain; /* List of open info-devs. */ wait_queue_head_t info_waitq; /* Wait-Queue for isdninfo */ struct timer_list timer; /* Misc.-function Timer */ - char drvid[ISDN_MAX_DRIVERS][20];/* Driver-ID */ struct task_struct *profd; /* For iprofd */ modem mdm; /* tty-driver-data */ struct semaphore sem; /* serialize list access*/ -- cgit v1.2.3 From b13ad6640872702e3a244bc9a883d679663cc11d Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:42:48 -0600 Subject: ISDN: Remove ISDN_STAT_NODCH It was never used anywhere (except for debugging output). Also, fix some compiler warnings. --- drivers/isdn/i4l/isdn_common.c | 15 +-------------- drivers/isdn/i4l/isdn_common.h | 2 +- drivers/isdn/i4l/isdn_tty.c | 16 ---------------- drivers/isdn/icn/icn.c | 1 - drivers/isdn/isdnloop/isdnloop.c | 1 - include/linux/isdnif.h | 1 - 6 files changed, 2 insertions(+), 34 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 0318ecaabbbb..2b29175e03e8 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -226,7 +226,6 @@ static int slot_bconn(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; - int sl = slot - slots; isdn_ctrl *ctrl = arg; fsm_change_state(fi, ST_SLOT_ACTIVE); @@ -242,7 +241,6 @@ static int slot_bhup(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; - int sl = slot - slots; isdn_ctrl *ctrl = arg; fsm_change_state(fi, ST_SLOT_WAIT_DHUP); @@ -255,7 +253,6 @@ static int slot_dhup(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; - int sl = slot - slots; isdn_ctrl *ctrl = arg; fsm_change_state(fi, ST_SLOT_BOUND); @@ -314,7 +311,6 @@ static int slot_bsent(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; - int sl = slot - slots; isdn_ctrl *ctrl = arg; do_stat_cb(slot, ctrl); @@ -489,10 +485,10 @@ struct isdn_driver { isdn_if *interface; /* Interface to driver */ int *rcverr; /* Error-counters for B rx */ int *rcvcount; /* Byte-counters for B rx */ + struct sk_buff_head *rpqueue; #ifdef CONFIG_ISDN_AUDIO unsigned long DLEflag; /* Insert DLE at next read */ #endif - struct sk_buff_head *rpqueue; /* Pointers to rx queue */ char msn2eaz[10][ISDN_MSNLEN]; /* MSN->EAZ */ struct fsm_inst fi; } driver; @@ -1255,15 +1251,6 @@ isdn_status_callback(isdn_ctrl * c) break; #endif #if 0 // FIXME - case ISDN_STAT_NODCH: - if (i < 0) - return -1; - dbg_statcallb("NODCH: %ld\n", c->arg); - if (isdn_net_stat_callback(i, c)) - break; - if (isdn_tty_stat_callback(i, c)) - break; - break; case ISDN_STAT_DISCH: save_flags(flags); cli(); diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index aec350c5f625..ebe6fa9492e8 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -66,7 +66,7 @@ extern int isdn_msncmp( const char *, const char *); #if defined(ISDN_DEBUG_NET_DUMP) || defined(ISDN_DEBUG_MODEM_DUMP) extern void isdn_dumppkt(char *, u_char *, int, int); #else -static inline void isdn_dumppkt(char *s, char *ss, u_char *d, int l, int m) { } +static inline void isdn_dumppkt(char *s, u_char *d, int l, int m) { } #endif struct dial_info { diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 67dfd9317b55..fa14bb2b0112 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -2349,22 +2349,6 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c) return 1; } break; - case ISDN_STAT_NODCH: -#ifdef ISDN_TTY_STAT_DEBUG - printk(KERN_DEBUG "tty_STAT_NODCH ttyI%d\n", info->line); -#endif - if (TTY_IS_ACTIVE(info)) { - if (info->dialing) { - info->dialing = 0; - info->last_l2 = -1; - info->last_si = 0; - sprintf(info->last_cause, "0000"); - isdn_tty_modem_result(RESULT_NO_DIALTONE, info); - } - isdn_tty_modem_hup(info, 0); - return 1; - } - break; case ISDN_STAT_UNLOAD: #ifdef ISDN_TTY_STAT_DEBUG printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line); diff --git a/drivers/isdn/icn/icn.c b/drivers/isdn/icn/icn.c index fb1f030d9c92..ef49d7201cc2 100644 --- a/drivers/isdn/icn/icn.c +++ b/drivers/isdn/icn/icn.c @@ -424,7 +424,6 @@ static icn_stat icn_stat_table[] = {"AOC", ISDN_STAT_CINF, 6}, /* Charge-info, DSS1-type */ {"CAU", ISDN_STAT_CAUSE, 7}, /* Cause code */ {"TEI OK", ISDN_STAT_RUN, 0}, /* Card connected to wallplug */ - {"NO D-CHAN", ISDN_STAT_NODCH, 0}, /* No D-channel available */ {"E_L1: ACT FAIL", ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */ {"E_L2: DATA LIN", ISDN_STAT_BHUP, 8}, /* Layer-2 data link lost */ {"E_L1: ACTIVATION FAILED", diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c index 612c7b19c85a..48752d299e8c 100644 --- a/drivers/isdn/isdnloop/isdnloop.c +++ b/drivers/isdn/isdnloop/isdnloop.c @@ -166,7 +166,6 @@ static isdnloop_stat isdnloop_stat_table[] = {"AOC", ISDN_STAT_CINF, 6}, /* Charge-info, DSS1-type */ {"CAU", ISDN_STAT_CAUSE, 7}, /* Cause code */ {"TEI OK", ISDN_STAT_RUN, 0}, /* Card connected to wallplug */ - {"NO D-CHAN", ISDN_STAT_NODCH, 0}, /* No D-channel available */ {"E_L1: ACT FAIL", ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */ {"E_L2: DATA LIN", ISDN_STAT_BHUP, 8}, /* Layer-2 data link lost */ {"E_L1: ACTIVATION FAILED", diff --git a/include/linux/isdnif.h b/include/linux/isdnif.h index c9718d4de584..b3298c9a66d4 100644 --- a/include/linux/isdnif.h +++ b/include/linux/isdnif.h @@ -202,7 +202,6 @@ typedef struct #define ISDN_STAT_LOAD 265 /* Signal new lowlevel-driver is loaded */ #define ISDN_STAT_UNLOAD 266 /* Signal unload of lowlevel-driver */ #define ISDN_STAT_BSENT 267 /* Signal packet sent */ -#define ISDN_STAT_NODCH 268 /* Signal no D-Channel */ #define ISDN_STAT_ADDCH 269 /* Add more Channels */ #define ISDN_STAT_CAUSE 270 /* Cause-Message */ #define ISDN_STAT_ICALLW 271 /* Incoming call without B-chan waiting */ -- cgit v1.2.3 From 05abe02258c620ec16f7c7b4e18a51550fb70537 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:44:07 -0600 Subject: ISDN: Remove ISDN_STAT_L1ERR It wasn't used in any actual hardware driver, nor did it cause any action at all. --- drivers/isdn/i4l/isdn_common.c | 2 -- drivers/isdn/isdnloop/isdnloop.c | 3 --- include/linux/isdnif.h | 7 ------- 3 files changed, 12 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 2dfd2cfd11ef..157d5f70448d 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1307,8 +1307,6 @@ isdn_status_callback(isdn_ctrl * c) restore_flags(flags); break; #endif - case ISDN_STAT_L1ERR: - break; case CAPI_PUT_MESSAGE: return(isdn_capi_rec_hl_msg(&c->parm.cmsg)); #ifdef CONFIG_ISDN_TTY_FAX diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c index 48752d299e8c..267e0e4a527b 100644 --- a/drivers/isdn/isdnloop/isdnloop.c +++ b/drivers/isdn/isdnloop/isdnloop.c @@ -71,9 +71,6 @@ isdnloop_bchan_send(isdnloop_card * card, int ch) printk(KERN_WARNING "isdnloop: no rcard, skb dropped\n"); dev_kfree_skb(skb); - cmd.command = ISDN_STAT_L1ERR; - cmd.parm.errcode = ISDN_STAT_L1ERR_SEND; - card->interface.statcallb(&cmd); }; cmd.command = ISDN_STAT_BSENT; cmd.parm.length = len; diff --git a/include/linux/isdnif.h b/include/linux/isdnif.h index b3298c9a66d4..342dd971b1b6 100644 --- a/include/linux/isdnif.h +++ b/include/linux/isdnif.h @@ -208,7 +208,6 @@ typedef struct #define ISDN_STAT_REDIR 272 /* Redir result */ #define ISDN_STAT_PROT 273 /* protocol IO specific callback */ #define ISDN_STAT_DISPLAY 274 /* deliver a received display message */ -#define ISDN_STAT_L1ERR 275 /* Signal Layer-1 Error */ #define ISDN_STAT_FAXIND 276 /* FAX indications from HL-driver */ #define ISDN_STAT_AUDIO 277 /* DTMF, DSP indications */ #define ISDN_STAT_DISCH 278 /* Disable/Enable channel usage */ @@ -219,12 +218,6 @@ typedef struct #define ISDN_AUDIO_SETDD 0 /* Set DTMF detection */ #define ISDN_AUDIO_DTMF 1 /* Rx/Tx DTMF */ -/* - * Values for errcode field - */ -#define ISDN_STAT_L1ERR_SEND 1 -#define ISDN_STAT_L1ERR_RECV 2 - /* * Values for feature-field of interface-struct. */ -- cgit v1.2.3 From 4a4833072f8cdb23905dc1225cb7aaf329715f97 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:47:51 -0600 Subject: ISDN: Remove ttyI specific from global "dev" variable ISDN still has a huge global struct called "dev", which is a mess of parts which should be private to their respective subsystem. It's supposed to die, this is another step in making that happen. --- drivers/isdn/i4l/isdn_common.c | 22 +++++++++++++--------- drivers/isdn/i4l/isdn_net_lib.c | 2 +- drivers/isdn/i4l/isdn_tty.c | 33 +++++++++++++++++---------------- drivers/isdn/i4l/isdn_tty.h | 12 ++++++++++++ include/linux/isdn.h | 12 ------------ 5 files changed, 43 insertions(+), 38 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 18d6061d5a24..a64e8a2921aa 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -356,10 +356,15 @@ slot_icall(struct fsm_inst *fi, int pr, void *arg) return 0; } +/* should become broadcast later */ static int slot_in_dhup(struct fsm_inst *fi, int pr, void *arg) { + struct isdn_slot *slot = fi->userdata; + isdn_ctrl *ctrl = arg; + fsm_change_state(fi, ST_SLOT_NULL); + do_stat_cb(slot, ctrl); return 0; } @@ -1847,14 +1852,14 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) return ret; for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - if (copy_to_user(p, dev->mdm.info[i].emu.profile, + if (copy_to_user(p, isdn_mdm.info[i].emu.profile, ISDN_MODEM_NUMREG)) return -EFAULT; p += ISDN_MODEM_NUMREG; - if (copy_to_user(p, dev->mdm.info[i].emu.pmsn, ISDN_MSNLEN)) + if (copy_to_user(p, isdn_mdm.info[i].emu.pmsn, ISDN_MSNLEN)) return -EFAULT; p += ISDN_MSNLEN; - if (copy_to_user(p, dev->mdm.info[i].emu.plmsn, ISDN_LMSNLEN)) + if (copy_to_user(p, isdn_mdm.info[i].emu.plmsn, ISDN_LMSNLEN)) return -EFAULT; p += ISDN_LMSNLEN; } @@ -1874,14 +1879,14 @@ isdn_ctrl_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg) return ret; for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - if (copy_from_user(dev->mdm.info[i].emu.profile, p, + if (copy_from_user(isdn_mdm.info[i].emu.profile, p, ISDN_MODEM_NUMREG)) return -EFAULT; p += ISDN_MODEM_NUMREG; - if (copy_from_user(dev->mdm.info[i].emu.plmsn, p, ISDN_LMSNLEN)) + if (copy_from_user(isdn_mdm.info[i].emu.plmsn, p, ISDN_LMSNLEN)) return -EFAULT; p += ISDN_LMSNLEN; - if (copy_from_user(dev->mdm.info[i].emu.pmsn, p, ISDN_MSNLEN)) + if (copy_from_user(isdn_mdm.info[i].emu.pmsn, p, ISDN_MSNLEN)) return -EFAULT; p += ISDN_MSNLEN; } @@ -2403,7 +2408,6 @@ isdn_slot_command(int sl, int cmd, isdn_ctrl *ctrl) return fsm_event(&slots[sl].fi, EV_SLOT_CMD_HANGUP, ctrl); } HERE; -// return isdn_command(ctrl); return -1; } @@ -2683,8 +2687,8 @@ static int __init isdn_init(void) slots[i].ch = -1; slots[i].m_idx = -1; strcpy(isdn_slot_num(i), "???"); - init_waitqueue_head(&dev->mdm.info[i].open_wait); - init_waitqueue_head(&dev->mdm.info[i].close_wait); + init_waitqueue_head(&isdn_mdm.info[i].open_wait); + init_waitqueue_head(&isdn_mdm.info[i].close_wait); slots[i].fi.fsm = &slot_fsm; slots[i].fi.state = ST_SLOT_NULL; slots[i].fi.debug = 1; diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c index 6b4c452c0bdc..36685d31235b 100644 --- a/drivers/isdn/i4l/isdn_net_lib.c +++ b/drivers/isdn/i4l/isdn_net_lib.c @@ -408,7 +408,7 @@ isdn_net_addif(char *name, isdn_net_local *mlp) mlp->hupflags = ISDN_INHUP; mlp->onhtime = 10; mlp->dialmax = 1; - mlp->flags = ISDN_NET_CBHUP | ISDN_NET_DM_MANUAL; + mlp->flags = ISDN_NET_CBHUP | ISDN_NET_DM_MANUAL | ISDN_NET_SECURE; mlp->cbdelay = 5 * HZ; /* Wait 5 secs before call-back */ mlp->dialtimeout = 60 * HZ;/* Wait 1 min for connection */ mlp->dialwait = 5 * HZ; /* Wait 5 sec. after failed dial */ diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 4b44a7d38871..a4c7d393e58a 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -48,6 +48,8 @@ static char *isdn_ttyname_ttyI = "ttyI"; static char *isdn_ttyname_cui = "cui"; #endif +struct isdn_modem isdn_mdm; + static int bit2si[8] = {1, 5, 7, 7, 7, 7, 7, 7}; static int si2bit[8] = @@ -126,7 +128,7 @@ isdn_tty_readmodem(void) for (i = 0; i < ISDN_MAX_CHANNELS; i++) { if ((midx = isdn_slot_m_idx(i)) >= 0) { - info = &dev->mdm.info[midx]; + info = &isdn_mdm.info[midx]; if (info->online) { r = 0; #ifdef CONFIG_ISDN_AUDIO @@ -1669,7 +1671,7 @@ isdn_tty_open(struct tty_struct *tty, struct file *filp) line = minor(tty->device) - tty->driver.minor_start; if (line < 0 || line > ISDN_MAX_CHANNELS) return -ENODEV; - info = &dev->mdm.info[line]; + info = &isdn_mdm.info[line]; if (isdn_tty_paranoia_check(info, tty->device, "isdn_tty_open")) return -ENODEV; #ifdef ISDN_DEBUG_MODEM_OPEN @@ -1939,11 +1941,11 @@ modem_write_profile(atemu * m) int isdn_tty_init(void) { - modem *m; + struct isdn_modem *m; int i, retval; modem_info *info; - m = &dev->mdm; + m = &isdn_mdm; memset(&m->tty_modem, 0, sizeof(struct tty_driver)); m->tty_modem.magic = TTY_DRIVER_MAGIC; m->tty_modem.name = isdn_ttyname_ttyI; @@ -2049,9 +2051,9 @@ isdn_tty_init(void) #endif kfree(info->xmit_buf - 4); } - tty_unregister_driver(&dev->mdm.cua_modem); + tty_unregister_driver(&isdn_mdm.cua_modem); err_unregister_tty: - tty_unregister_driver(&dev->mdm.tty_modem); + tty_unregister_driver(&isdn_mdm.tty_modem); err: return retval; } @@ -2059,20 +2061,19 @@ isdn_tty_init(void) void isdn_tty_exit(void) { - modem *m = &dev->mdm; modem_info *info; int i; for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - info = &m->info[i]; + info = &isdn_mdm.info[i]; isdn_tty_cleanup_xmit(info); #ifdef CONFIG_ISDN_TTY_FAX kfree(info->fax); #endif kfree(info->xmit_buf - 4); } - tty_unregister_driver(&dev->mdm.cua_modem); - tty_unregister_driver(&dev->mdm.tty_modem); + tty_unregister_driver(&isdn_mdm.cua_modem); + tty_unregister_driver(&isdn_mdm.tty_modem); } /* @@ -2168,7 +2169,7 @@ isdn_tty_find_icall(int di, int ch, int sl, setup_parm *setup) save_flags(flags); cli(); for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &dev->mdm.info[i]; + modem_info *info = &isdn_mdm.info[i]; if (info->count == 0) continue; @@ -2354,7 +2355,7 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c) printk(KERN_DEBUG "tty_STAT_UNLOAD ttyI%d\n", info->line); #endif for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - info = &dev->mdm.info[i]; + info = &isdn_mdm.info[i]; if (isdn_slot_driver(info->isdn_slot) == c->driver) { if (info->online) isdn_tty_modem_hup(info, 1); @@ -3905,7 +3906,7 @@ isdn_tty_modem_escape(void) for (i = 0; i < ISDN_MAX_CHANNELS; i++) if (USG_MODEM(isdn_slot_usage(i))) if ((midx = isdn_slot_m_idx(i)) >= 0) { - modem_info *info = &dev->mdm.info[midx]; + modem_info *info = &isdn_mdm.info[midx]; if (info->online) { ton = 1; if ((info->emu.pluscount == 3) && @@ -3931,7 +3932,7 @@ isdn_tty_modem_ring(void) int i; for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &dev->mdm.info[i]; + modem_info *info = &isdn_mdm.info[i]; if (info->msr & UART_MSR_RI) { ton = 1; isdn_tty_modem_result(RESULT_RING, info); @@ -3951,7 +3952,7 @@ isdn_tty_modem_xmit(void) int i; for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &dev->mdm.info[i]; + modem_info *info = &isdn_mdm.info[i]; if (info->online) { ton = 1; isdn_tty_senddown(info); @@ -3972,7 +3973,7 @@ isdn_tty_carrier_timeout(void) int i; for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &dev->mdm.info[i]; + modem_info *info = &isdn_mdm.info[i]; if (info->dialing) { if (info->emu.carrierwait++ > info->emu.mdmreg[REG_WAITC]) { info->dialing = 0; diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 5b82b66fc134..48194fd4c619 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -117,3 +117,15 @@ extern void isdn_tty_fax_bitorder(modem_info *, struct sk_buff *); extern int isdn_tty_init(void); extern void isdn_tty_exit(void); + +struct isdn_modem { + int refcount; /* Number of opens */ + struct tty_driver tty_modem; /* tty-device */ + struct tty_driver cua_modem; /* cua-device */ + struct tty_struct *modem_table[ISDN_MAX_CHANNELS]; /* ?? copied from Orig */ + struct termios *modem_termios[ISDN_MAX_CHANNELS]; + struct termios *modem_termios_locked[ISDN_MAX_CHANNELS]; + modem_info info[ISDN_MAX_CHANNELS]; /* Private data */ +}; + +extern struct isdn_modem isdn_mdm; diff --git a/include/linux/isdn.h b/include/linux/isdn.h index ded1aad43e4c..74376a0a5e38 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -368,17 +368,6 @@ typedef struct modem_info { #define ISDN_MODEM_WINSIZE 8 -/* Description of one ISDN-tty */ -typedef struct { - int refcount; /* Number of opens */ - struct tty_driver tty_modem; /* tty-device */ - struct tty_driver cua_modem; /* cua-device */ - struct tty_struct *modem_table[ISDN_MAX_CHANNELS]; /* ?? copied from Orig */ - struct termios *modem_termios[ISDN_MAX_CHANNELS]; - struct termios *modem_termios_locked[ISDN_MAX_CHANNELS]; - modem_info info[ISDN_MAX_CHANNELS]; /* Private data */ -} modem; - /*======================= End of ISDN-tty stuff ============================*/ /*======================== Start of V.110 stuff ============================*/ @@ -427,7 +416,6 @@ typedef struct isdn_devt { wait_queue_head_t info_waitq; /* Wait-Queue for isdninfo */ struct timer_list timer; /* Misc.-function Timer */ struct task_struct *profd; /* For iprofd */ - modem mdm; /* tty-driver-data */ struct semaphore sem; /* serialize list access*/ unsigned long global_features; #ifdef CONFIG_DEVFS_FS -- cgit v1.2.3 From 620a00187ea32b497e5cf46aa73949b5ad7a4fbf Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:49:56 -0600 Subject: ISDN: Move the tty receive queue out of generic code Moving the tty receive queue into the tty-specific data in fact simplifies the common code (which doesn't need to know it at all, now), and the tty code, which can access the queue more directly. --- drivers/isdn/i4l/isdn_audio.c | 5 +- drivers/isdn/i4l/isdn_common.c | 182 +---------------------------------------- drivers/isdn/i4l/isdn_common.h | 3 - drivers/isdn/i4l/isdn_tty.c | 110 +++++++++++++++++++++++-- drivers/isdn/i4l/isdn_tty.h | 7 ++ include/linux/isdn.h | 3 + 6 files changed, 119 insertions(+), 191 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_audio.c b/drivers/isdn/i4l/isdn_audio.c index 4a4bfcd68f6b..fddfa960b0bb 100644 --- a/drivers/isdn/i4l/isdn_audio.c +++ b/drivers/isdn/i4l/isdn_audio.c @@ -14,6 +14,7 @@ #include #include "isdn_audio.h" #include "isdn_common.h" +#include "isdn_tty.h" /* * Misc. lookup-tables. @@ -564,7 +565,7 @@ isdn_audio_eval_dtmf(modem_info * info) cli(); di = isdn_slot_driver(info->isdn_slot); ch = isdn_slot_channel(info->isdn_slot); - isdn_slot_queue_tail(info->isdn_slot, skb, 2); + isdn_tty_queue_tail(info, skb, 2); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) @@ -683,7 +684,7 @@ isdn_audio_put_dle_code(modem_info * info, u_char code) cli(); di = isdn_slot_driver(info->isdn_slot); ch = isdn_slot_channel(info->isdn_slot); - isdn_slot_queue_tail(info->isdn_slot, skb, 2); + isdn_tty_queue_tail(info, skb, 2); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 3383f1f341b2..8c58b98c3438 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -299,13 +299,8 @@ slot_data_req(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; struct sk_buff *skb = arg; - int retval; - /* Update statistics */ -// slots[sl].ibytes += skb->len; - - retval = isdn_drv_writebuf_skb(slot->di, slot->ch, 1, skb); - return retval; + return isdn_drv_writebuf_skb(slot->di, slot->ch, 1, skb); } static int @@ -401,7 +396,6 @@ slot_unbind(struct fsm_inst *fi, int pr, void *arg) slot->iv110.v110 = NULL; // 20.10.99 JIM, try to reinitialize v110 ! isdn_slot_set_usage(sl, ISDN_USAGE_NONE); - isdn_slot_queue_purge(sl); return 0; } @@ -497,12 +491,6 @@ struct isdn_driver { int maxbufsize; /* Maximum Buffersize supported*/ int stavail; /* Chars avail on Status-device*/ isdn_if *interface; /* Interface to driver */ - int *rcverr; /* Error-counters for B rx */ - int *rcvcount; /* Byte-counters for B rx */ - struct sk_buff_head *rpqueue; -#ifdef CONFIG_ISDN_AUDIO - unsigned long DLEflag; /* Insert DLE at next read */ -#endif char msn2eaz[10][ISDN_MSNLEN]; /* MSN->EAZ */ struct fsm_inst fi; } driver; @@ -578,13 +566,6 @@ isdn_drv_lookup(char *drvid) static void drv_destroy(struct isdn_driver *drv) { - int i; - - kfree(drv->rcverr); - kfree(drv->rcvcount); - for (i = 0; i < drv->channels; i++) - skb_queue_purge(&drv->rpqueue[i]); - kfree(drv->rpqueue); kfree(drv); } @@ -1446,108 +1427,6 @@ isdn_getnum(char **p) #define DLE 0x10 -/* - * isdn_slot_readbchan() tries to get data from the read-queue. - * It MUST be called with interrupts off. - */ -int -isdn_slot_readbchan(int sl, u_char * buf, u_char * fp, int len) -{ - int count; - int count_pull; - int count_put; - int dflag; - int di = isdn_slot_driver(sl); - int ch = isdn_slot_channel(sl); - struct sk_buff *skb; - u_char *cp; - - if (!drivers[di]) - return 0; - if (skb_queue_empty(&drivers[di]->rpqueue[ch])) - return 0; - - if (len > drivers[di]->rcvcount[ch]) - len = drivers[di]->rcvcount[ch]; - cp = buf; - count = 0; - while (len) { - if (!(skb = skb_peek(&drivers[di]->rpqueue[ch]))) - break; -#ifdef CONFIG_ISDN_AUDIO - if (ISDN_AUDIO_SKB_LOCK(skb)) - break; - ISDN_AUDIO_SKB_LOCK(skb) = 1; - if ((ISDN_AUDIO_SKB_DLECOUNT(skb)) || (drivers[di]->DLEflag & (1 << ch))) { - char *p = skb->data; - unsigned long DLEmask = (1 << ch); - - dflag = 0; - count_pull = count_put = 0; - while ((count_pull < skb->len) && (len > 0)) { - len--; - if (drivers[di]->DLEflag & DLEmask) { - *cp++ = DLE; - drivers[di]->DLEflag &= ~DLEmask; - } else { - *cp++ = *p; - if (*p == DLE) { - drivers[di]->DLEflag |= DLEmask; - (ISDN_AUDIO_SKB_DLECOUNT(skb))--; - } - p++; - count_pull++; - } - count_put++; - } - if (count_pull >= skb->len) - dflag = 1; - } else { -#endif - /* No DLE's in buff, so simply copy it */ - dflag = 1; - if ((count_pull = skb->len) > len) { - count_pull = len; - dflag = 0; - } - count_put = count_pull; - memcpy(cp, skb->data, count_put); - cp += count_put; - len -= count_put; -#ifdef CONFIG_ISDN_AUDIO - } -#endif - count += count_put; - if (fp) { - memset(fp, 0, count_put); - fp += count_put; - } - if (dflag) { - /* We got all the data in this buff. - * Now we can dequeue it. - */ - if (fp) - *(fp - 1) = 0xff; -#ifdef CONFIG_ISDN_AUDIO - ISDN_AUDIO_SKB_LOCK(skb) = 0; -#endif - skb = skb_dequeue(&drivers[di]->rpqueue[ch]); - dev_kfree_skb(skb); - } else { - /* Not yet emptied this buff, so it - * must stay in the queue, for further calls - * but we pull off the data we got until now. - */ - skb_pull(skb, count_pull); -#ifdef CONFIG_ISDN_AUDIO - ISDN_AUDIO_SKB_LOCK(skb) = 0; -#endif - } - drivers[di]->rcvcount[ch] -= count_put; - } - return count; -} - static __inline int isdn_minor2drv(int minor) { @@ -2380,40 +2259,6 @@ isdn_add_channels(struct isdn_driver *d, int drvidx, int n, int adding) ISDN_MAX_CHANNELS); return -1; } - if ((adding) && (d->rcverr)) - kfree(d->rcverr); - if (!(d->rcverr = kmalloc(sizeof(int) * m, GFP_KERNEL))) { - printk(KERN_WARNING "register_isdn: Could not alloc rcverr\n"); - return -1; - } - memset((char *) d->rcverr, 0, sizeof(int) * m); - - if ((adding) && (d->rcvcount)) - kfree(d->rcvcount); - if (!(d->rcvcount = kmalloc(sizeof(int) * m, GFP_KERNEL))) { - printk(KERN_WARNING "register_isdn: Could not alloc rcvcount\n"); - if (!adding) kfree(d->rcverr); - return -1; - } - memset((char *) d->rcvcount, 0, sizeof(int) * m); - - if ((adding) && (d->rpqueue)) { - for (j = 0; j < d->channels; j++) - skb_queue_purge(&d->rpqueue[j]); - kfree(d->rpqueue); - } - if (!(d->rpqueue = kmalloc(sizeof(struct sk_buff_head) * m, GFP_KERNEL))) { - printk(KERN_WARNING "register_isdn: Could not alloc rpqueue\n"); - if (!adding) { - kfree(d->rcvcount); - kfree(d->rcverr); - } - return -1; - } - for (j = 0; j < m; j++) { - skb_queue_head_init(&d->rpqueue[j]); - } - dev->channels += n; save_flags(flags); cli(); @@ -2689,31 +2534,6 @@ isdn_slot_priv(int sl) return slots[sl].priv; } -int -isdn_slot_queue_empty(int sl) -{ - BUG_ON(sl < 0); - - return skb_queue_empty(&drivers[slots[sl].di]->rpqueue[slots[sl].ch]); -} - -void -isdn_slot_queue_tail(int sl, struct sk_buff *skb, int len) -{ - BUG_ON(sl < 0); - - __skb_queue_tail(&drivers[slots[sl].di]->rpqueue[slots[sl].ch], skb); - drivers[slots[sl].di]->rcvcount[slots[sl].ch] += len; -} - -void -isdn_slot_queue_purge(int sl) -{ - BUG_ON(sl < 0); - - skb_queue_purge(&drivers[slots[sl].di]->rpqueue[slots[sl].ch]); -} - int isdn_hard_header_len(void) { diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index f06ccab719f2..edcf4f00d8e2 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -99,9 +99,6 @@ extern void isdn_slot_set_priv(int sl, int usage, void *priv, int (*stat_cb)(in extern void *isdn_slot_priv(int sl); extern int isdn_hard_header_len(void); -int isdn_slot_queue_empty(int sl); -void isdn_slot_queue_tail(int sl, struct sk_buff *skb, int len); -void isdn_slot_queue_purge(int sl); int isdn_drv_maxbufsize(int di); int isdn_drv_writebuf_skb(int di, int ch, int x, struct sk_buff *skb); int isdn_drv_hdrlen(int di); diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index a4c7d393e58a..3a688ba73c07 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -110,6 +110,103 @@ isdn_tty_try_read(modem_info * info, struct sk_buff *skb) return 0; } +/* + * isdn_slot_readbchan() tries to get data from the read-queue. + * It MUST be called with interrupts off. + */ +static int +isdn_tty_readbchan(struct modem_info *info, u_char * buf, u_char * fp, int len) +{ + int count; + int count_pull; + int count_put; + int dflag; + struct sk_buff *skb; + u_char *cp; + + if (skb_queue_empty(&info->rpqueue)) + return 0; + + if (len > info->rcvcount) + len = info->rcvcount; + cp = buf; + count = 0; + while (len) { + if (!(skb = skb_peek(&info->rpqueue))) + break; +#ifdef CONFIG_ISDN_AUDIO + if (ISDN_AUDIO_SKB_LOCK(skb)) + break; + ISDN_AUDIO_SKB_LOCK(skb) = 1; + if (ISDN_AUDIO_SKB_DLECOUNT(skb) || info->DLEflag) { + char *p = skb->data; + + dflag = 0; + count_pull = count_put = 0; + while ((count_pull < skb->len) && (len > 0)) { + len--; + if (info->DLEflag) { + *cp++ = DLE; + info->DLEflag = 0; + } else { + *cp++ = *p; + if (*p == DLE) { + info->DLEflag = 1; + (ISDN_AUDIO_SKB_DLECOUNT(skb))--; + } + p++; + count_pull++; + } + count_put++; + } + if (count_pull >= skb->len) + dflag = 1; + } else { +#endif + /* No DLE's in buff, so simply copy it */ + dflag = 1; + if ((count_pull = skb->len) > len) { + count_pull = len; + dflag = 0; + } + count_put = count_pull; + memcpy(cp, skb->data, count_put); + cp += count_put; + len -= count_put; +#ifdef CONFIG_ISDN_AUDIO + } +#endif + count += count_put; + if (fp) { + memset(fp, 0, count_put); + fp += count_put; + } + if (dflag) { + /* We got all the data in this buff. + * Now we can dequeue it. + */ + if (fp) + *(fp - 1) = 0xff; +#ifdef CONFIG_ISDN_AUDIO + ISDN_AUDIO_SKB_LOCK(skb) = 0; +#endif + skb = skb_dequeue(&info->rpqueue); + dev_kfree_skb(skb); + } else { + /* Not yet emptied this buff, so it + * must stay in the queue, for further calls + * but we pull off the data we got until now. + */ + skb_pull(skb, count_pull); +#ifdef CONFIG_ISDN_AUDIO + ISDN_AUDIO_SKB_LOCK(skb) = 0; +#endif + } + info->rcvcount -= count_put; + } + return count; +} + /* isdn_tty_readmodem() is called periodically from within timer-interrupt. * It tries getting received data from the receive queue an stuff it into * the tty's flip-buffer. @@ -142,7 +239,7 @@ isdn_tty_readmodem(void) if (c > 0) { save_flags(flags); cli(); - r = isdn_slot_readbchan(info->isdn_slot, + r = isdn_tty_readbchan(info, tty->flip.char_buf_ptr, tty->flip.flag_buf_ptr, c); /* CISCO AsyncPPP Hack */ @@ -263,7 +360,7 @@ isdn_tty_rcv_skb(int i, struct sk_buff *skb) /* Try to deliver directly via tty-flip-buf if queue is empty */ save_flags(flags); cli(); - if (isdn_slot_queue_empty(i)) + if (skb_queue_empty(&info->rpqueue)) if (isdn_tty_try_read(info, skb)) { restore_flags(flags); return 1; @@ -271,7 +368,7 @@ isdn_tty_rcv_skb(int i, struct sk_buff *skb) /* Direct deliver failed or queue wasn't empty. * Queue up for later dequeueing via timer-irq. */ - isdn_slot_queue_tail(i, skb, skb->len + isdn_tty_queue_tail(info, skb, skb->len #ifdef CONFIG_ISDN_AUDIO + ISDN_AUDIO_SKB_DLECOUNT(skb) #endif @@ -739,6 +836,7 @@ isdn_tty_modem_hup(modem_info * info, int local) isdn_slot_all_eaz(slot); info->emu.mdmreg[REG_RINGCNT] = 0; + skb_queue_purge(&info->rpqueue); isdn_slot_free(slot); isdn_slot_set_priv(slot, 0, NULL, NULL, NULL); info->isdn_slot = -1; @@ -2025,6 +2123,7 @@ isdn_tty_init(void) init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); info->isdn_slot = -1; + skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); #ifdef CONFIG_ISDN_AUDIO @@ -2067,6 +2166,7 @@ isdn_tty_exit(void) for (i = 0; i < ISDN_MAX_CHANNELS; i++) { info = &isdn_mdm.info[i]; isdn_tty_cleanup_xmit(info); + skb_queue_purge(&info->rpqueue); #ifdef CONFIG_ISDN_TTY_FAX kfree(info->fax); #endif @@ -2430,7 +2530,7 @@ isdn_tty_at_cout(char *msg, modem_info * info) di = -1; ch = -1; } if ((info->online) && (((tty->flip.count + strlen(msg)) >= TTY_FLIPBUF_SIZE) || - (!isdn_slot_queue_empty(info->isdn_slot)))) { + (!skb_queue_empty(&info->rpqueue)))) { skb = alloc_skb(strlen(msg) #ifdef CONFIG_ISDN_AUDIO + sizeof(isdn_audio_skb) @@ -2473,7 +2573,7 @@ isdn_tty_at_cout(char *msg, modem_info * info) } } if (skb) { - isdn_slot_queue_tail(info->isdn_slot, skb, skb->len); + isdn_tty_queue_tail(info, skb, skb->len); restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 48194fd4c619..96c14d1765e0 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -129,3 +129,10 @@ struct isdn_modem { }; extern struct isdn_modem isdn_mdm; + +static inline void +isdn_tty_queue_tail(modem_info *info, struct sk_buff *skb, int len) +{ + __skb_queue_tail(&info->rpqueue, skb); + info->rcvcount += len; +} diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 74376a0a5e38..4ab5ac856cc9 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -328,6 +328,8 @@ typedef struct modem_info { int dialing; /* Dial in progress or ATA */ int rcvsched; /* Receive needs schedule */ int isdn_slot; /* Index to isdn-driver/channel */ + struct sk_buff_head rpqueue; /* Queue of recv'd packets */ + int rcvcount; /* Byte-counters for B rx */ int ncarrier; /* Flag: schedule NO CARRIER */ unsigned char last_cause[8]; /* Last cause message */ unsigned char last_num[ISDN_MSNLEN]; @@ -344,6 +346,7 @@ typedef struct modem_info { struct sk_buff_head xmit_queue; /* transmit queue */ atomic_t xmit_lock; /* Semaphore for isdn_tty_write */ #ifdef CONFIG_ISDN_AUDIO + unsigned long DLEflag; /* Insert DLE at next read */ int vonline; /* Voice-channel status */ /* Bit 0 = recording */ /* Bit 1 = playback */ -- cgit v1.2.3 From b6b5803ff9b3dbad981deb6092cbea890bc64cb7 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:56:02 -0600 Subject: ISDN: Pass around struct isdn_slot directly The common way in the kernel is to pass around the struct (e.g. struct net_device), and leave the user the possibility to add its private data using ::priv, so do it the same way when accessing an ISDN channel. --- drivers/isdn/i4l/isdn_common.c | 138 ++++++++++------------------------------ drivers/isdn/i4l/isdn_common.h | 45 ++++++++----- drivers/isdn/i4l/isdn_net_lib.c | 96 ++++++++++++++-------------- drivers/isdn/i4l/isdn_net_lib.h | 6 +- drivers/isdn/i4l/isdn_tty.c | 96 +++++++++++++++------------- drivers/isdn/i4l/isdn_tty.h | 2 +- drivers/isdn/i4l/isdn_ttyfax.c | 23 +++---- drivers/isdn/i4l/isdn_v110.c | 14 ++-- drivers/isdn/i4l/isdn_v110.h | 6 +- include/linux/isdn.h | 2 +- 10 files changed, 190 insertions(+), 238 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 941d75df098a..3a2f833798f0 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -26,7 +26,6 @@ #include "isdn_audio.h" #endif #include -#include "isdn_v110.h" #include MODULE_DESCRIPTION("ISDN4Linux: link layer"); @@ -57,22 +56,6 @@ static char *slot_st_str[] = { "ST_SLOT_WAIT_DHUP", }; -struct isdn_slot { - int di; /* driver index */ - struct isdn_driver *drv; /* driver */ - int ch; /* channel index (per driver) */ - int usage; /* how is it used */ - char num[ISDN_MSNLEN]; /* the current phone number */ - unsigned long ibytes; /* Statistics incoming bytes */ - unsigned long obytes; /* Statistics outgoing bytes */ - struct isdn_v110 iv110; /* For V.110 */ - int m_idx; /* Index for mdm.... */ - void *priv; /* pointer to isdn_net_dev */ - int (*event_cb)(int sl, int pr, void *arg); - struct fsm_inst fi; -}; - - static char *ev_str[] = { "EV_DRV_REGISTER", "EV_STAT_RUN", @@ -117,10 +100,8 @@ static int isdn_v110_data_req(struct isdn_slot *slot, struct sk_buff *skb); static inline int do_event_cb(struct isdn_slot *slot, int pr, void *arg) { - int sl = slot - slots; - if (slot->event_cb) - return slot->event_cb(sl, pr, arg); + return slot->event_cb(slot, pr, arg); return -ENXIO; } @@ -304,7 +285,6 @@ slot_icall(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; isdn_ctrl *ctrl = arg; - int sl = slot - slots; int retval; fsm_change_state(fi, ST_SLOT_IN); @@ -314,15 +294,13 @@ slot_icall(struct fsm_inst *fi, int pr, void *arg) strcpy(slot->num, ctrl->parm.setup.phone); /* Try to find a network-interface which will accept incoming call */ - retval = isdn_net_find_icall(ctrl->driver, ctrl->arg, sl, - &ctrl->parm.setup); + retval = isdn_net_find_icall(slot, &ctrl->parm.setup); /* already taken by net now? */ if (fi->state != ST_SLOT_IN) goto out; - retval = isdn_tty_find_icall(ctrl->driver, ctrl->arg, sl, - &ctrl->parm.setup); + retval = isdn_tty_find_icall(slot, &ctrl->parm.setup); out: return 0; } @@ -342,12 +320,11 @@ static int slot_unbind(struct fsm_inst *fi, int pr, void *arg) { struct isdn_slot *slot = fi->userdata; - int sl = slot - slots; isdn_ctrl cmd; strcpy(slot->num, "???"); cmd.parm.num[0] = '\0'; - isdn_slot_command(sl, ISDN_CMD_SETEAZ, &cmd); + isdn_slot_command(slot, ISDN_CMD_SETEAZ, &cmd); slot->ibytes = 0; slot->obytes = 0; slot->usage = ISDN_USAGE_NONE; @@ -1990,7 +1967,7 @@ isdn_map_eaz2msn(char *msn, int di) * Find an unused ISDN-channel, whose feature-flags match the * given L2- and L3-protocols. */ -int +struct isdn_slot * isdn_get_free_slot(int usage, int l2_proto, int l3_proto, int pre_dev, int pre_chan, char *msn) { @@ -2029,32 +2006,28 @@ isdn_get_free_slot(int usage, int l2_proto, int l3_proto, slot->usage = usage; isdn_info_update(); fsm_event(&slot->fi, EV_SLOT_BIND, NULL); - return i; + return slot; } } restore_flags(flags); - return -1; + return NULL; } /* * Set state of ISDN-channel to 'unused' */ void -isdn_slot_free(int sl) +isdn_slot_free(struct isdn_slot *slot) { - fsm_event(&slots[sl].fi, EV_SLOT_UNBIND, NULL); + fsm_event(&slot->fi, EV_SLOT_UNBIND, NULL); } /* * Return: length of data on success, -ERRcode on failure. */ int -isdn_slot_write(int sl, struct sk_buff *skb) +isdn_slot_write(struct isdn_slot *slot, struct sk_buff *skb) { - struct isdn_slot *slot = &slots[sl]; - - BUG_ON(sl < 0); - return fsm_event(&slot->fi, EV_DATA_REQ, skb); } @@ -2157,38 +2130,26 @@ EXPORT_SYMBOL(isdn_ppp_unregister_compressor); #endif int -isdn_slot_maxbufsize(int sl) +isdn_slot_maxbufsize(struct isdn_slot *slot) { - BUG_ON(sl < 0); - - return slots[sl].drv->maxbufsize; + return slot->drv->maxbufsize; } int -isdn_slot_hdrlen(int sl) +isdn_slot_hdrlen(struct isdn_slot *slot) { - struct isdn_slot *slot = &slots[sl]; - - BUG_ON(sl < 0); - return slot->drv->interface->hl_hdrlen; } char * -isdn_slot_map_eaz2msn(int sl, char *msn) +isdn_slot_map_eaz2msn(struct isdn_slot *slot, char *msn) { - struct isdn_slot *slot = &slots[sl]; - - BUG_ON(sl < 0); - return isdn_map_eaz2msn(msn, slot->di); } int -isdn_slot_command(int sl, int cmd, isdn_ctrl *ctrl) +isdn_slot_command(struct isdn_slot *slot, int cmd, isdn_ctrl *ctrl) { - struct isdn_slot *slot = &slots[sl]; - ctrl->command = cmd; ctrl->driver = slot->di; @@ -2230,14 +2191,11 @@ isdn_slot_command(int sl, int cmd, isdn_ctrl *ctrl) } int -isdn_slot_dial(int sl, struct dial_info *dial) +isdn_slot_dial(struct isdn_slot *slot, struct dial_info *dial) { - struct isdn_slot *slot = &slots[sl]; isdn_ctrl cmd; int retval; - char *msn = isdn_slot_map_eaz2msn(sl, dial->msn); - - BUG_ON(sl < 0); + char *msn = isdn_slot_map_eaz2msn(slot, dial->msn); /* check for DOV */ if (dial->si1 == 7 && tolower(dial->phone[0]) == 'v') { /* DOV call */ @@ -2249,21 +2207,21 @@ isdn_slot_dial(int sl, struct dial_info *dial) slot->usage |= ISDN_USAGE_OUTGOING; isdn_info_update(); - retval = isdn_slot_command(sl, ISDN_CMD_CLREAZ, &cmd); + retval = isdn_slot_command(slot, ISDN_CMD_CLREAZ, &cmd); if (retval) return retval; strcpy(cmd.parm.num, msn); - retval = isdn_slot_command(sl, ISDN_CMD_SETEAZ, &cmd); + retval = isdn_slot_command(slot, ISDN_CMD_SETEAZ, &cmd); cmd.arg = dial->l2_proto << 8; cmd.parm.fax = dial->fax; - retval = isdn_slot_command(sl, ISDN_CMD_SETL2, &cmd); + retval = isdn_slot_command(slot, ISDN_CMD_SETL2, &cmd); if (retval) return retval; cmd.arg = dial->l3_proto << 8; - retval = isdn_slot_command(sl, ISDN_CMD_SETL3, &cmd); + retval = isdn_slot_command(slot, ISDN_CMD_SETL3, &cmd); if (retval) return retval; @@ -2272,12 +2230,12 @@ isdn_slot_dial(int sl, struct dial_info *dial) strcpy(cmd.parm.setup.eazmsn, msn); strcpy(cmd.parm.setup.phone, dial->phone); - printk(KERN_INFO "ISDN: slot %d: Dialing %s -> %s (SI %d/%d) (B %d/%d)\n", - sl, cmd.parm.setup.eazmsn, cmd.parm.setup.phone, + printk(KERN_INFO "ISDN: Dialing %s -> %s (SI %d/%d) (B %d/%d)\n", + cmd.parm.setup.eazmsn, cmd.parm.setup.phone, cmd.parm.setup.si1, cmd.parm.setup.si2, dial->l2_proto, dial->l3_proto); - return isdn_slot_command(sl, ISDN_CMD_DIAL, &cmd); + return isdn_slot_command(slot, ISDN_CMD_DIAL, &cmd); } int @@ -2297,39 +2255,15 @@ isdn_slot_m_idx(int sl) } void -isdn_slot_set_m_idx(int sl, int midx) +isdn_slot_set_m_idx(struct isdn_slot *slot, int midx) { - BUG_ON(sl < 0); - - slots[sl].m_idx = midx; + slot->m_idx = midx; } char * -isdn_slot_num(int sl) -{ - BUG_ON(sl < 0); - - return slots[sl].num; -} - -void -isdn_slot_set_priv(int sl, int usage, void *priv, - int (*event_cb)(int sl, int pr, void *arg)) -{ - BUG_ON(sl < 0); - - slots[sl].usage &= ISDN_USAGE_EXCLUSIVE; - slots[sl].usage |= usage; - slots[sl].priv = priv; - slots[sl].event_cb = event_cb; -} - -void * -isdn_slot_priv(int sl) +isdn_slot_num(struct isdn_slot *slot) { - BUG_ON(sl < 0); - - return slots[sl].priv; + return slot->num; } int @@ -2548,35 +2482,29 @@ isdn_v110_add_features(struct isdn_driver *drv) static void __isdn_v110_open(struct isdn_slot *slot) { - int sl = slot - slots; - if (!slot->iv110.v110emu) return; - isdn_v110_open(sl, &slot->iv110); + isdn_v110_open(slot, &slot->iv110); } static void __isdn_v110_close(struct isdn_slot *slot) { - int sl = slot - slots; - if (!slot->iv110.v110emu) return; - isdn_v110_close(sl, &slot->iv110); + isdn_v110_close(slot, &slot->iv110); } static void __isdn_v110_bsent(struct isdn_slot *slot, int pr, isdn_ctrl *c) { - int sl = slot - slots; - if (!slot->iv110.v110emu) { do_event_cb(slot, pr, c); return; } - isdn_v110_bsent(sl, &slot->iv110); + isdn_v110_bsent(slot, &slot->iv110); } /* @@ -2615,8 +2543,6 @@ isdn_v110_setl2(struct isdn_slot *slot, isdn_ctrl *cmd) static int isdn_v110_data_ind(struct isdn_slot *slot, struct sk_buff *skb) { - int sl = slot - slots; - if (!slot->iv110.v110emu) goto recv; @@ -2626,7 +2552,7 @@ isdn_v110_data_ind(struct isdn_slot *slot, struct sk_buff *skb) recv: if (slot->event_cb) - slot->event_cb(sl, EV_DATA_IND, skb); + slot->event_cb(slot, EV_DATA_IND, skb); return 0; } diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index df087a2316b8..294c17956f39 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -10,6 +10,7 @@ */ #include +#include "isdn_v110.h" #undef ISDN_DEBUG_MODEM_OPEN #undef ISDN_DEBUG_MODEM_IOCTL @@ -68,6 +69,21 @@ extern void isdn_dumppkt(char *, u_char *, int, int); static inline void isdn_dumppkt(char *s, u_char *d, int l, int m) { } #endif +struct isdn_slot { + int di; /* driver index */ + struct isdn_driver *drv; /* driver */ + int ch; /* channel index (per driver) */ + int usage; /* how is it used */ + char num[ISDN_MSNLEN]; /* the current phone number */ + unsigned long ibytes; /* Statistics incoming bytes */ + unsigned long obytes; /* Statistics outgoing bytes */ + struct isdn_v110 iv110; /* For V.110 */ + int m_idx; /* Index for mdm.... */ + void *priv; /* pointer to isdn_net_dev */ + int (*event_cb)(struct isdn_slot *, int pr, void *arg); + struct fsm_inst fi; +}; + struct dial_info { int l2_proto; int l3_proto; @@ -78,22 +94,19 @@ struct dial_info { unsigned char *phone; }; -extern int isdn_get_free_slot(int, int, int, int, int, char *); -extern void isdn_slot_free(int slot); -extern int isdn_slot_command(int slot, int cmd, isdn_ctrl *); -extern int isdn_slot_dial(int slot, struct dial_info *dial); -extern char *isdn_slot_map_eaz2msn(int slot, char *msn); -extern int isdn_slot_write(int slot, struct sk_buff *); -extern int isdn_slot_hdrlen(int slot); -extern int isdn_slot_maxbufsize(int slot); -extern int isdn_slot_usage(int slot); -extern char *isdn_slot_num(int slot); -extern int isdn_slot_m_idx(int slot); -extern void isdn_slot_set_m_idx(int slot, int midx); -extern void isdn_slot_set_priv(int sl, int usage, void *priv, - int (*event_cb)(int sl, int pr, void *arg)); -extern void *isdn_slot_priv(int sl); -extern int isdn_hard_header_len(void); +struct isdn_slot *isdn_get_free_slot(int, int, int, int, int, char *); +void isdn_slot_free(struct isdn_slot *); +int isdn_slot_command(struct isdn_slot *, int cmd, isdn_ctrl *); +int isdn_slot_dial(struct isdn_slot *, struct dial_info *dial); +char *isdn_slot_map_eaz2msn(struct isdn_slot *, char *msn); +int isdn_slot_write(struct isdn_slot *, struct sk_buff *); +int isdn_slot_hdrlen(struct isdn_slot *); +int isdn_slot_maxbufsize(struct isdn_slot *); +char *isdn_slot_num(struct isdn_slot *); +void isdn_slot_set_m_idx(struct isdn_slot *, int midx); +int isdn_hard_header_len(void); +int isdn_slot_m_idx(int sl); +int isdn_slot_usage(int sl); int isdn_drv_lookup(char *drvid); char *isdn_drv_drvid(int di); diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c index 22621984d4eb..78e3874c46a2 100644 --- a/drivers/isdn/i4l/isdn_net_lib.c +++ b/drivers/isdn/i4l/isdn_net_lib.c @@ -294,21 +294,21 @@ isdn_net_bind(isdn_net_dev *idev, isdn_net_ioctl_cfg *cfg) goto out; } } - if (cfg->exclusive == (idev->exclusive >= 0) && + if (cfg->exclusive == !!idev->exclusive && drvidx == idev->pre_device && chidx == idev->pre_channel) { /* no change */ retval = 0; goto out; } - if (idev->exclusive >= 0) { + if (idev->exclusive) { isdn_slot_free(idev->exclusive); - idev->exclusive = -1; + idev->exclusive = NULL; } if (cfg->exclusive) { /* If binding is exclusive, try to grab the channel */ idev->exclusive = isdn_get_free_slot(ISDN_USAGE_NET | ISDN_USAGE_EXCLUSIVE, mlp->l2_proto, mlp->l3_proto, drvidx, chidx, cfg->eaz); - if (idev->exclusive < 0) { + if (!idev->exclusive) { /* Grab failed, because desired channel is in use */ retval = -EBUSY; goto out; @@ -368,10 +368,10 @@ isdn_net_addif(char *name, isdn_net_local *mlp) tasklet_init(&idev->tlet, isdn_net_tasklet, (unsigned long) idev); skb_queue_head_init(&idev->super_tx_queue); - idev->isdn_slot = -1; + idev->isdn_slot = NULL; idev->pre_device = -1; idev->pre_channel = -1; - idev->exclusive = -1; + idev->exclusive = NULL; idev->pppbind = -1; @@ -643,7 +643,7 @@ isdn_net_getcfg(isdn_net_ioctl_cfg *cfg) mlp = idev->mlp; strcpy(cfg->eaz, mlp->msn); - cfg->exclusive = idev->exclusive >= 0; + cfg->exclusive = !!idev->exclusive; if (idev->pre_device >= 0) { sprintf(cfg->drvid, "%s,%d", isdn_drv_drvid(idev->pre_device), idev->pre_channel); @@ -853,7 +853,7 @@ static int isdn_net_getpeer(isdn_net_ioctl_phone *phone, isdn_net_ioctl_phone *peer) { isdn_net_dev *idev = isdn_net_findif(phone->name); - int idx; + struct isdn_slot *slot; if (!idev) return -ENODEV; @@ -863,15 +863,15 @@ isdn_net_getpeer(isdn_net_ioctl_phone *phone, isdn_net_ioctl_phone *peer) * in (partially) wrong number copied to user. This race * currently ignored. */ - idx = idev->isdn_slot; - if (idx < 0) + slot = idev->isdn_slot; + if (slot < 0) return -ENOTCONN; /* for pre-bound channels, we need this extra check */ - if (strncmp(isdn_slot_num(idx), "???", 3) == 0 ) + if (strncmp(isdn_slot_num(slot), "???", 3) == 0 ) return -ENOTCONN; - strncpy(phone->phone, isdn_slot_num(idx), ISDN_MSNLEN); - phone->outgoing = USG_OUTGOING(isdn_slot_usage(idx)); + strncpy(phone->phone, isdn_slot_num(slot), ISDN_MSNLEN); + phone->outgoing = USG_OUTGOING(slot->usage); if (copy_to_user(peer, phone, sizeof(*peer))) return -EFAULT; @@ -1202,14 +1202,15 @@ isdn_net_unbind_channel(isdn_net_dev *idev) if (mlp->ops->unbind) mlp->ops->unbind(idev); - isdn_slot_set_priv(idev->isdn_slot, 0, NULL, NULL); + idev->isdn_slot->priv = NULL; + idev->isdn_slot->event_cb = NULL; skb_queue_purge(&idev->super_tx_queue); if (idev->isdn_slot != idev->exclusive) isdn_slot_free(idev->isdn_slot); - idev->isdn_slot = -1; + idev->isdn_slot = NULL; if (idev->fi.state != ST_NULL) { lp_put(mlp); @@ -1217,27 +1218,29 @@ isdn_net_unbind_channel(isdn_net_dev *idev) } } -static int isdn_net_event_callback(int sl, int pr, void *arg); +static int isdn_net_event_callback(struct isdn_slot *slot, int pr, void *arg); /* * Assign an ISDN-channel to a net-interface */ static int -isdn_net_bind_channel(isdn_net_dev *idev, int slot) +isdn_net_bind_channel(isdn_net_dev *idev, struct isdn_slot *slot) { isdn_net_local *mlp = idev->mlp; int retval = 0; - idev->isdn_slot = slot; - isdn_slot_set_priv(idev->isdn_slot, ISDN_USAGE_NET, idev, - isdn_net_event_callback); - if (mlp->ops->bind) retval = mlp->ops->bind(idev); if (retval < 0) - isdn_net_unbind_channel(idev); + goto out; + idev->isdn_slot = slot; + slot->priv = idev; + slot->event_cb = isdn_net_event_callback; + slot->usage |= ISDN_USAGE_NET; + + out: return retval; } @@ -1368,7 +1371,7 @@ accept_icall(struct fsm_inst *fi, int pr, void *arg) isdn_net_dev *idev = fi->userdata; isdn_net_local *mlp = idev->mlp; isdn_ctrl cmd; - int slot = (int) arg; + struct isdn_slot *slot = arg; isdn_net_bind_channel(idev, slot); @@ -1407,8 +1410,8 @@ do_callback(struct fsm_inst *fi, int pr, void *arg) } static int -isdn_net_dev_icall(isdn_net_dev *idev, int slot, int di, int ch, int si1, - char *eaz, char *nr) +isdn_net_dev_icall(isdn_net_dev *idev, struct isdn_slot *slot, + int si1, char *eaz, char *nr) { isdn_net_local *mlp = idev->mlp; struct isdn_net_phone *ph; @@ -1438,11 +1441,11 @@ isdn_net_dev_icall(isdn_net_dev *idev, int slot, int di, int ch, int si1, } dbg_net_icall("%s: pdev=%d di=%d pch=%d ch = %d\n", idev->name, - idev->pre_device, di, idev->pre_channel, ch); + idev->pre_device, slot->di, idev->pre_channel, slot->ch); /* check if exclusive */ - if ((isdn_slot_usage(slot) & ISDN_USAGE_EXCLUSIVE) && - (idev->pre_channel != ch || idev->pre_device != di)) { + if ((slot->usage & ISDN_USAGE_EXCLUSIVE) && + (idev->pre_channel != slot->ch || idev->pre_device != slot->di)) { dbg_net_icall("%s: excl check failed\n", idev->name); return 0; } @@ -1476,7 +1479,7 @@ isdn_net_dev_icall(isdn_net_dev *idev, int slot, int di, int ch, int si1, printk(KERN_INFO "%s: call from %s -> %s accepted\n", idev->name, nr, eaz); - if (fsm_event(&idev->fi, EV_NET_DO_ACCEPT, (void *) slot)) { + if (fsm_event(&idev->fi, EV_NET_DO_ACCEPT, slot)) { lp_put(mlp); return 0; } @@ -1500,7 +1503,7 @@ isdn_net_dev_icall(isdn_net_dev *idev, int slot, int di, int ch, int si1, * would eventually match if CID was longer. */ int -isdn_net_find_icall(int di, int ch, int sl, setup_parm *setup) +isdn_net_find_icall(struct isdn_slot *slot, setup_parm *setup) { isdn_net_local *lp; isdn_net_dev *idev; @@ -1540,8 +1543,8 @@ isdn_net_find_icall(int di, int ch, int sl, setup_parm *setup) return 0; } - dbg_net_icall("n_fi: di=%d ch=%d sl=%d usg=%d\n", di, ch, sl, - isdn_slot_usage(sl)); + dbg_net_icall("n_fi: di=%d ch=%d usg=%#x\n", slot->di, slot->ch, + slot->usage); retval = 0; spin_lock_irqsave(&running_devs_lock, flags); @@ -1550,7 +1553,7 @@ isdn_net_find_icall(int di, int ch, int sl, setup_parm *setup) spin_unlock_irqrestore(&running_devs_lock, flags); list_for_each_entry(idev, &lp->slaves, slaves) { - retval = isdn_net_dev_icall(idev, sl, di, ch, si1, eaz, nr); + retval = isdn_net_dev_icall(idev, slot, si1, eaz, nr); if (retval > 0) break; } @@ -1599,7 +1602,7 @@ do_dial(struct fsm_inst *fi, int pr, void *arg) { isdn_net_dev *idev = fi->userdata; isdn_net_local *mlp = idev->mlp; - int slot; + struct isdn_slot *slot; if (ISDN_NET_DIALMODE(*mlp) == ISDN_NET_DM_OFF) return -EPERM; @@ -1607,13 +1610,13 @@ do_dial(struct fsm_inst *fi, int pr, void *arg) if (list_empty(&mlp->phone[1])) /* no number to dial ? */ return -EINVAL; - if (idev->exclusive >= 0) + if (idev->exclusive) slot = idev->exclusive; else slot = isdn_get_free_slot(ISDN_USAGE_NET, mlp->l2_proto, mlp->l3_proto, idev->pre_device, idev->pre_channel, mlp->msn); - if (slot < 0) + if (!slot) return -EAGAIN; if (isdn_net_bind_channel(idev, slot) < 0) { @@ -1856,12 +1859,12 @@ isdn_net_hangup(isdn_net_dev *idev) printk(KERN_INFO "%s: local hangup\n", idev->name); // FIXME via state machine - if (idev->isdn_slot >= 0) - isdn_slot_command(idev->isdn_slot, ISDN_CMD_HANGUP, &cmd); + if (idev->isdn_slot) + isdn_slot_command(idev->isdn_slot, ISDN_CMD_HANGUP, &cmd); return 1; } -static int isdn_net_rcv_skb(int idx, struct sk_buff *skb); +static int isdn_net_rcv_skb(struct isdn_slot *slot, struct sk_buff *skb); /* * Handle status-messages from ISDN-interfacecard. @@ -1869,16 +1872,17 @@ static int isdn_net_rcv_skb(int idx, struct sk_buff *skb); * isdn_status_callback, which itself is called from the low-level driver. */ static int -isdn_net_event_callback(int sl, int pr, void *arg) +isdn_net_event_callback(struct isdn_slot *slot, int pr, void *arg) { - isdn_net_dev *idev = isdn_slot_priv(sl); + isdn_net_dev *idev = slot->priv; - if (!idev) + if (!idev) { + isdn_BUG(); return 0; - + } switch (pr) { case EV_DATA_IND: - return isdn_net_rcv_skb(sl, arg); + return isdn_net_rcv_skb(slot, arg); case EV_STAT_DCONN: return fsm_event(&idev->fi, EV_NET_STAT_DCONN, arg); case EV_STAT_BCONN: @@ -2267,9 +2271,9 @@ isdn_net_write_super(isdn_net_dev *idev, struct sk_buff *skb) * else return 0. */ static int -isdn_net_rcv_skb(int idx, struct sk_buff *skb) +isdn_net_rcv_skb(struct isdn_slot *slot, struct sk_buff *skb) { - isdn_net_dev *idev = isdn_slot_priv(idx); + isdn_net_dev *idev = slot->priv; isdn_net_local *mlp; if (!idev) { diff --git a/drivers/isdn/i4l/isdn_net_lib.h b/drivers/isdn/i4l/isdn_net_lib.h index cd822e827d2f..0258036dc0fb 100644 --- a/drivers/isdn/i4l/isdn_net_lib.h +++ b/drivers/isdn/i4l/isdn_net_lib.h @@ -50,7 +50,7 @@ void isdn_net_lib_init(void); void isdn_net_lib_exit(void); void isdn_net_hangup_all(void); int isdn_net_ioctl(struct inode *, struct file *, uint, ulong); -int isdn_net_find_icall(int, int, int, setup_parm *); +int isdn_net_find_icall(struct isdn_slot *slot, setup_parm *setup); /* provided for interface types to use */ void isdn_net_writebuf_skb(isdn_net_dev *, struct sk_buff *skb); @@ -133,10 +133,10 @@ struct isdn_net_local_s { /* per ISDN channel (ISDN interface) data */ struct isdn_net_dev_s { - int isdn_slot; /* Index to isdn device/channel */ + struct isdn_slot *isdn_slot; /* Index to isdn device/channel */ + struct isdn_slot *exclusive; /* NULL if non excl */ int pre_device; /* Preselected isdn-device */ int pre_channel; /* Preselected isdn-channel */ - int exclusive; /* -1 if non excl./idx to excl chan */ struct timer_list dial_timer; /* dial events timer */ struct fsm_inst fi; /* call control state machine */ diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 90b7c6bf603b..3a57ba4fa2c0 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -31,20 +31,20 @@ static void isdn_tty_modem_reset_regs(modem_info *, int); static void isdn_tty_cmd_ATA(modem_info *); static void isdn_tty_flush_buffer(struct tty_struct *); static void isdn_tty_modem_result(int, modem_info *); -static int isdn_tty_stat_callback(int i, isdn_ctrl *c); -static int isdn_tty_rcv_skb(int i, struct sk_buff *skb); +static int isdn_tty_stat_callback(struct isdn_slot *slot, isdn_ctrl *c); +static int isdn_tty_rcv_skb(struct isdn_slot *slot, struct sk_buff *skb); #ifdef CONFIG_ISDN_AUDIO static int isdn_tty_countDLE(unsigned char *, int); #endif static int -isdn_tty_event_callback(int sl, int pr, void *arg) +isdn_tty_event_callback(struct isdn_slot *slot, int pr, void *arg) { switch (pr) { case EV_DATA_IND: - return isdn_tty_rcv_skb(sl, arg); + return isdn_tty_rcv_skb(slot, arg); default: - return isdn_tty_stat_callback(sl, arg); + return isdn_tty_stat_callback(slot, arg); } } @@ -281,7 +281,7 @@ isdn_tty_readmodem(void) } static int -isdn_tty_rcv_skb(int i, struct sk_buff *skb) +isdn_tty_rcv_skb(struct isdn_slot *slot, struct sk_buff *skb) { ulong flags; #ifdef CONFIG_ISDN_AUDIO @@ -289,7 +289,7 @@ isdn_tty_rcv_skb(int i, struct sk_buff *skb) #endif modem_info *info; - info = isdn_slot_priv(i); + info = slot->priv; #ifdef CONFIG_ISDN_AUDIO ifmt = 1; @@ -728,7 +728,7 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m) int si = 7; int l2 = m->mdmreg[REG_L2PROT]; ulong flags; - int i; + struct isdn_slot *slot; int j; for (j = 7; j >= 0; j--) @@ -751,8 +751,8 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m) m->mdmreg[REG_SI1I] = si2bit[si]; save_flags(flags); cli(); - i = isdn_get_free_slot(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); - if (i < 0) { + slot = isdn_get_free_slot(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); + if (!slot) { restore_flags(flags); isdn_tty_modem_result(RESULT_NO_DIALTONE, info); } else { @@ -765,9 +765,11 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m) .phone = n, }; - info->isdn_slot = i; - isdn_slot_set_m_idx(i, info->line); - isdn_slot_set_priv(i, ISDN_USAGE_MODEM, info, isdn_tty_event_callback); + info->isdn_slot = slot; + isdn_slot_set_m_idx(slot, info->line); + slot->usage |= ISDN_USAGE_MODEM; + slot->priv = info; + slot->event_cb = isdn_tty_event_callback; info->last_dir = 1; info->last_l2 = l2; strcpy(info->last_num, n); @@ -793,13 +795,13 @@ void isdn_tty_modem_hup(modem_info * info, int local) { isdn_ctrl cmd; - int slot; + struct isdn_slot *slot; if (!info) return; slot = info->isdn_slot; - if (slot < 0) + if (!slot) return; #ifdef ISDN_DEBUG_MODEM_HUP @@ -848,9 +850,10 @@ isdn_tty_modem_hup(modem_info * info, int local) info->emu.mdmreg[REG_RINGCNT] = 0; skb_queue_purge(&info->rpqueue); + slot->priv = NULL; + slot->event_cb = NULL; isdn_slot_free(slot); - isdn_slot_set_priv(slot, 0, NULL, NULL); - info->isdn_slot = -1; + info->isdn_slot = NULL; } /* @@ -910,7 +913,7 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m) int l2 = m->mdmreg[REG_L2PROT]; isdn_ctrl cmd; ulong flags; - int i; + struct isdn_slot *slot; int j; int l; @@ -935,14 +938,16 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m) m->mdmreg[REG_SI1I] = si2bit[si]; save_flags(flags); cli(); - i = isdn_get_free_slot(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); - if (i < 0) { + slot = isdn_get_free_slot(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); + if (!slot) { restore_flags(flags); isdn_tty_modem_result(RESULT_NO_DIALTONE, info); } else { - info->isdn_slot = i; - isdn_slot_set_m_idx(i, info->line); - isdn_slot_set_priv(i, ISDN_USAGE_MODEM, info, isdn_tty_event_callback); + info->isdn_slot = slot; + isdn_slot_set_m_idx(slot, info->line); + slot->usage |= ISDN_USAGE_MODEM; + slot->priv = info; + slot->event_cb = isdn_tty_event_callback; info->last_dir = 1; // strcpy(info->last_num, n); restore_flags(flags); @@ -981,7 +986,7 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg) int l2 = m->mdmreg[REG_L2PROT]; isdn_ctrl cmd; ulong flags; - int i; + struct isdn_slot *slot; int j; int l; @@ -1010,14 +1015,16 @@ isdn_tty_send_msg(modem_info * info, atemu * m, char *msg) m->mdmreg[REG_SI1I] = si2bit[si]; save_flags(flags); cli(); - i = isdn_get_free_slot(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); - if (i < 0) { + slot = isdn_get_free_slot(usg, l2, m->mdmreg[REG_L3PROT], -1, -1, m->msn); + if (!slot) { restore_flags(flags); isdn_tty_modem_result(RESULT_NO_DIALTONE, info); } else { - info->isdn_slot = i; - isdn_slot_set_m_idx(i, info->line); - isdn_slot_set_priv(i, ISDN_USAGE_MODEM, info, isdn_tty_event_callback); + info->isdn_slot = slot; + isdn_slot_set_m_idx(slot, info->line); + slot->usage |= ISDN_USAGE_MODEM; + slot->priv = info; + slot->event_cb = isdn_tty_event_callback; info->last_dir = 1; restore_flags(flags); info->last_l2 = l2; @@ -1212,7 +1219,7 @@ isdn_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int co c = count; if (c > info->xmit_size - info->xmit_count) c = info->xmit_size - info->xmit_count; - if (info->isdn_slot >= 0 && c > isdn_slot_maxbufsize(info->isdn_slot)) + if (info->isdn_slot && c > isdn_slot_maxbufsize(info->isdn_slot)) c = isdn_slot_maxbufsize(info->isdn_slot); if (c <= 0) break; @@ -2123,7 +2130,7 @@ isdn_tty_init(void) info->normal_termios = m->tty_modem.init_termios; init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); - info->isdn_slot = -1; + info->isdn_slot = NULL; skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); @@ -2240,7 +2247,7 @@ isdn_tty_match_icall(char *cid, atemu *emu, int di) * CID is longer. */ int -isdn_tty_find_icall(int di, int ch, int sl, setup_parm *setup) +isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup) { char *eaz; int i; @@ -2285,17 +2292,18 @@ isdn_tty_find_icall(int di, int ch, int sl, setup_parm *setup) #ifndef FIX_FILE_TRANSFER (info->flags & ISDN_ASYNC_NORMAL_ACTIVE) && #endif - (info->isdn_slot == -1) && - (USG_NONE(isdn_slot_usage(sl)))) { + (!info->isdn_slot)) { int matchret; - if ((matchret = isdn_tty_match_icall(eaz, &info->emu, di)) > wret) + if ((matchret = isdn_tty_match_icall(eaz, &info->emu, slot->di)) > wret) wret = matchret; if (!matchret) { /* EAZ is matching */ - info->isdn_slot = sl; - isdn_slot_set_m_idx(sl, info->line); - isdn_slot_set_priv(sl, isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]), info, isdn_tty_event_callback); - strcpy(isdn_slot_num(sl), nr); + info->isdn_slot = slot; + isdn_slot_set_m_idx(slot, info->line); + slot->usage |= isdn_calc_usage(si1, info->emu.mdmreg[REG_L2PROT]); + slot->priv = info; + slot->event_cb = isdn_tty_event_callback; + strcpy(slot->num, nr); strcpy(info->emu.cpn, eaz); info->emu.mdmreg[REG_SI1I] = si2bit[si1]; info->emu.mdmreg[REG_PLAN] = setup->plan; @@ -2321,13 +2329,13 @@ isdn_tty_find_icall(int di, int ch, int sl, setup_parm *setup) (info->flags & (ISDN_ASYNC_NORMAL_ACTIVE | ISDN_ASYNC_CALLOUT_ACTIVE)) static int -isdn_tty_stat_callback(int i, isdn_ctrl *c) +isdn_tty_stat_callback(struct isdn_slot *slot, isdn_ctrl *c) { isdn_ctrl cmd; modem_info *info; char *e; - info = isdn_slot_priv(i); + info = slot->priv; if (1) { switch (c->command) { case ISDN_STAT_CINF: @@ -2423,14 +2431,14 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c) info->last_dir = 0; info->dialing = 0; info->rcvsched = 1; - if (USG_MODEM(isdn_slot_usage(i))) { + if (USG_MODEM(slot->usage)) { if (info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_MODEM) { strcpy(info->emu.connmsg, c->parm.num); isdn_tty_modem_result(RESULT_CONNECT, info); } else isdn_tty_modem_result(RESULT_CONNECT64000, info); } - if (USG_VOICE(isdn_slot_usage(i))) + if (USG_VOICE(slot->usage)) isdn_tty_modem_result(RESULT_VCON, info); return 1; } @@ -2570,7 +2578,7 @@ isdn_tty_at_cout(char *msg, modem_info * info) static void isdn_tty_on_hook(modem_info * info) { - if (info->isdn_slot >= 0) { + if (info->isdn_slot) { #ifdef ISDN_DEBUG_MODEM_HUP printk(KERN_DEBUG "Mhup in isdn_tty_on_hook\n"); #endif diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 96c14d1765e0..060302c6a589 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -104,7 +104,7 @@ extern void isdn_tty_carrier_timeout(void); extern void isdn_tty_modem_xmit(void); extern int isdn_tty_init(void); extern void isdn_tty_readmodem(void); -extern int isdn_tty_find_icall(int, int, int, setup_parm *); +extern int isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup); extern void isdn_tty_cleanup_xmit(modem_info *); extern int isdn_tty_capi_facility(capi_msg *cm); extern void isdn_tty_at_cout(char *, modem_info *); diff --git a/drivers/isdn/i4l/isdn_ttyfax.c b/drivers/isdn/i4l/isdn_ttyfax.c index bfe49a1400a2..35142304fdbe 100644 --- a/drivers/isdn/i4l/isdn_ttyfax.c +++ b/drivers/isdn/i4l/isdn_ttyfax.c @@ -53,7 +53,7 @@ isdn_tty_fax_modem_result(int code, modem_info * info) case 2: /* +FCON */ /* Append CPN, if enabled */ if ((m->mdmreg[REG_CPNFCON] & BIT_CPNFCON) && - (!(isdn_slot_usage(info->isdn_slot) & ISDN_USAGE_OUTGOING))) { + (!(info->isdn_slot->usage & ISDN_USAGE_OUTGOING))) { sprintf(rs, "/%s", m->cpn); isdn_tty_at_cout(rs, info); } @@ -301,7 +301,8 @@ isdn_tty_cmd_FCLASS1(char **p, modem_info * info) static char *cmd[] = {"AE", "TS", "RS", "TM", "RM", "TH", "RH"}; isdn_ctrl c; - int par, i; + int par; + struct isdn_slot *slot; long flags; for (c.parm.aux.cmd = 0; c.parm.aux.cmd < 7; c.parm.aux.cmd++) @@ -343,7 +344,7 @@ isdn_tty_cmd_FCLASS1(char **p, modem_info * info) printk(KERN_DEBUG "isdn_tty_cmd_FCLASS1 %d/%d/%d)\n", c.parm.aux.cmd, c.parm.aux.subcmd, c.parm.aux.para[0]); #endif - if (info->isdn_slot < 0) { + if (!info->isdn_slot) { save_flags(flags); cli(); if ((c.parm.aux.subcmd == AT_EQ_VALUE) || @@ -352,18 +353,18 @@ isdn_tty_cmd_FCLASS1(char **p, modem_info * info) PARSE_ERROR1; } /* get a temporary connection to the first free fax driver */ - i = isdn_get_free_slot(ISDN_USAGE_FAX, ISDN_PROTO_L2_FAX, + slot = isdn_get_free_slot(ISDN_USAGE_FAX, ISDN_PROTO_L2_FAX, ISDN_PROTO_L3_FCLASS1, -1, -1, "00"); - if (i < 0) { + if (!slot) { restore_flags(flags); PARSE_ERROR1; } - info->isdn_slot = i; - isdn_slot_set_m_idx(i, info->line); - isdn_slot_command(info->isdn_slot, ISDN_CMD_FAXCMD, &c); - isdn_slot_free(info->isdn_slot); - isdn_slot_set_m_idx(i, -1); - info->isdn_slot = -1; + info->isdn_slot = slot; + isdn_slot_set_m_idx(slot, info->line); + isdn_slot_command(slot, ISDN_CMD_FAXCMD, &c); + isdn_slot_free(slot); + isdn_slot_set_m_idx(slot, -1); + info->isdn_slot = NULL; restore_flags(flags); } else { isdn_slot_command(info->isdn_slot, ISDN_CMD_FAXCMD, &c); diff --git a/drivers/isdn/i4l/isdn_v110.c b/drivers/isdn/i4l/isdn_v110.c index ed2d8f12abf8..be702981df0e 100644 --- a/drivers/isdn/i4l/isdn_v110.c +++ b/drivers/isdn/i4l/isdn_v110.c @@ -512,11 +512,11 @@ buffer_full: void -isdn_v110_open(int sl, struct isdn_v110 *iv110) +isdn_v110_open(struct isdn_slot *slot, struct isdn_v110 *iv110) { isdn_v110_stream *v; - int hdrlen = isdn_slot_hdrlen(sl); - int maxsize = isdn_slot_maxbufsize(sl); + int hdrlen = isdn_slot_hdrlen(slot); + int maxsize = isdn_slot_maxbufsize(slot); atomic_inc(&iv110->v110use); switch (iv110->v110emu) { @@ -533,7 +533,7 @@ isdn_v110_open(int sl, struct isdn_v110 *iv110) if ((v = iv110->v110)) { while (v->SyncInit) { struct sk_buff *skb = isdn_v110_sync(v); - if (isdn_slot_write(sl, skb) <= 0) { + if (isdn_slot_write(slot, skb) <= 0) { dev_kfree_skb(skb); /* Unable to send, try later */ break; @@ -547,7 +547,7 @@ isdn_v110_open(int sl, struct isdn_v110 *iv110) } void -isdn_v110_close(int sl, struct isdn_v110 *iv110) +isdn_v110_close(struct isdn_slot *slot, struct isdn_v110 *iv110) { while (1) { atomic_inc(&iv110->v110use); @@ -560,7 +560,7 @@ isdn_v110_close(int sl, struct isdn_v110 *iv110) } int -isdn_v110_bsent(int sl, struct isdn_v110 *iv110) +isdn_v110_bsent(struct isdn_slot *slot, struct isdn_v110 *iv110) { isdn_v110_stream *v = iv110->v110; int i, ret; @@ -587,7 +587,7 @@ isdn_v110_bsent(int sl, struct isdn_v110 *iv110) else skb = isdn_v110_idle(v); if (skb) { - if (isdn_slot_write(sl, skb) <= 0) { + if (isdn_slot_write(slot, skb) <= 0) { dev_kfree_skb(skb); break; } else { diff --git a/drivers/isdn/i4l/isdn_v110.h b/drivers/isdn/i4l/isdn_v110.h index 77a947481166..36b404f56f48 100644 --- a/drivers/isdn/i4l/isdn_v110.h +++ b/drivers/isdn/i4l/isdn_v110.h @@ -26,10 +26,10 @@ extern struct sk_buff *isdn_v110_encode(isdn_v110_stream *, struct sk_buff *); */ extern struct sk_buff *isdn_v110_decode(isdn_v110_stream *, struct sk_buff *); -extern void isdn_v110_open(int sl, struct isdn_v110 *iv110); +extern void isdn_v110_open(struct isdn_slot *slot, struct isdn_v110 *iv110); -extern void isdn_v110_close(int sl, struct isdn_v110 *iv110); +extern void isdn_v110_close(struct isdn_slot *slot, struct isdn_v110 *iv110); -extern int isdn_v110_bsent(int sl, struct isdn_v110 *iv110); +extern int isdn_v110_bsent(struct isdn_slot *slot, struct isdn_v110 *iv110); #endif diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 4ab5ac856cc9..c5352e5d1194 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -327,7 +327,7 @@ typedef struct modem_info { /* 2 = B-Channel is up, deliver d.*/ int dialing; /* Dial in progress or ATA */ int rcvsched; /* Receive needs schedule */ - int isdn_slot; /* Index to isdn-driver/channel */ + struct isdn_slot *isdn_slot; /* Ptr to isdn-driver/channel */ struct sk_buff_head rpqueue; /* Queue of recv'd packets */ int rcvcount; /* Byte-counters for B rx */ int ncarrier; /* Flag: schedule NO CARRIER */ -- cgit v1.2.3 From 91267c945b0f04f4089ce8749ff6d1a2c2114275 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:57:04 -0600 Subject: ISDN: New timer handling for "+++" escape sequence Instead of having one common timer and walking the list of all ISDN channels, which might be possibly associated with a ttyI and even more possibly so waiting for the silence period after "+++", just use a per ttyI timer, which only gets activated when necessary. --- drivers/isdn/i4l/isdn_common.c | 4 +- drivers/isdn/i4l/isdn_tty.c | 121 ++++++++++++++++------------------------- drivers/isdn/i4l/isdn_tty.h | 1 - include/linux/isdn.h | 5 +- 4 files changed, 50 insertions(+), 81 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 3a2f833798f0..238bd997dbde 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1163,8 +1163,6 @@ isdn_timer_funct(ulong dummy) if (tf & ISDN_TIMER_FAST) { if (tf & ISDN_TIMER_MODEMREAD) isdn_tty_readmodem(); - if (tf & ISDN_TIMER_MODEMPLUS) - isdn_tty_modem_escape(); if (tf & ISDN_TIMER_MODEMXMIT) isdn_tty_modem_xmit(); } @@ -1983,7 +1981,7 @@ isdn_get_free_slot(int usage, int l2_proto, int l3_proto, for (i = 0; i < ISDN_MAX_CHANNELS; i++) { slot = &slots[i]; - if (drivers[slot->di]->fi.state != ST_DRV_RUNNING) + if (!slot->drv || slot->drv->fi.state != ST_DRV_RUNNING) continue; if (!USG_NONE(slots[i].usage)) diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 3a57ba4fa2c0..5635c9ff3658 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -26,7 +26,9 @@ /* Prototypes */ static int isdn_tty_edit_at(const char *, int, modem_info *, int); -static void isdn_tty_check_esc(const u_char *, u_char, int, int *, int *, int); +static void isdn_tty_escape_timer(unsigned long data); +static void isdn_tty_check_esc(struct modem_info *info, + const unsigned char *p, int count); static void isdn_tty_modem_reset_regs(modem_info *, int); static void isdn_tty_cmd_ATA(modem_info *); static void isdn_tty_flush_buffer(struct tty_struct *); @@ -1228,13 +1230,6 @@ isdn_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int co || (info->vonline & 3) #endif ) { -#ifdef CONFIG_ISDN_AUDIO - if (!info->vonline) -#endif - isdn_tty_check_esc(buf, m->mdmreg[REG_ESC], c, - &(m->pluscount), - &(m->lastplus), - from_user); if (from_user) { if (copy_from_user(&(info->xmit_buf[info->xmit_count]), buf, c)) { total = -EFAULT; @@ -1242,6 +1237,10 @@ isdn_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int co } } else memcpy(&(info->xmit_buf[info->xmit_count]), buf, c); +#ifdef CONFIG_ISDN_AUDIO + if (!info->vonline) +#endif + isdn_tty_check_esc(info, &info->xmit_buf[info->xmit_count], c); #ifdef CONFIG_ISDN_AUDIO if (info->vonline) { int cc = isdn_tty_handleDLEdown(info, m, c); @@ -2131,6 +2130,9 @@ isdn_tty_init(void) init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); info->isdn_slot = NULL; + init_timer(&info->escape_timer); + info->escape_timer.data = (unsigned long) info; + info->escape_timer.function = isdn_tty_escape_timer; skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); @@ -2595,55 +2597,56 @@ isdn_tty_off_hook(void) #define PLUSWAIT1 (HZ/2) /* 0.5 sec. */ #define PLUSWAIT2 (HZ*3/2) /* 1.5 sec */ +static void +isdn_tty_escape_timer(unsigned long data) +{ + struct modem_info *info = (struct modem_info *) data; + + if (!info->online) + return; + + info->emu.pluscount = 0; + info->online = 0; + isdn_tty_modem_result(RESULT_OK, info); +} + /* * Check Buffer for Modem-escape-sequence, activate timer-callback to * isdn_tty_modem_escape() if sequence found. - * - * Parameters: - * p pointer to databuffer - * plus escape-character - * count length of buffer - * pluscount count of valid escape-characters so far - * lastplus timestamp of last character */ -static void -isdn_tty_check_esc(const u_char * p, u_char plus, int count, int *pluscount, - int *lastplus, int from_user) +static void isdn_tty_check_esc(struct modem_info *info, + const unsigned char *p, int count) { - char cbuf[3]; + unsigned char plus = info->emu.mdmreg[REG_ESC]; if (plus > 127) return; + if (count > 3) { p += count - 3; count = 3; - *pluscount = 0; + info->emu.pluscount = 0; + info->emu.lastplus = jiffies; } - if (from_user) { - if (copy_from_user(cbuf, p, count)) - return; - p = cbuf; - } - while (count > 0) { - if (*(p++) == plus) { - if ((*pluscount)++) { - /* Time since last '+' > 0.5 sec. ? */ - if (time_after(jiffies, *lastplus + PLUSWAIT1)) - *pluscount = 1; - } else { - /* Time since last non-'+' < 1.5 sec. ? */ - if (time_before(jiffies, *lastplus + PLUSWAIT2)) - *pluscount = 0; - } - if ((*pluscount == 3) && (count == 1)) - isdn_timer_ctrl(ISDN_TIMER_MODEMPLUS, 1); - if (*pluscount > 3) - *pluscount = 1; - } else - *pluscount = 0; - *lastplus = jiffies; - count--; + for (; count > 0; info->emu.lastplus = jiffies, count--) { + if (*(p++) != plus) { + info->emu.pluscount = 0; + continue; + } + if (info->emu.pluscount == 0) { + if (time_after(jiffies, info->emu.lastplus + PLUSWAIT2)) + info->emu.pluscount = 1; + } else { + if (time_after(jiffies, info->emu.lastplus + PLUSWAIT1)) + info->emu.pluscount = 1; + else + info->emu.pluscount++; + } } + if (info->emu.pluscount == 3) + mod_timer(&info->escape_timer, jiffies + PLUSWAIT2); + else + del_timer(&info->escape_timer); } /* @@ -3977,36 +3980,6 @@ isdn_tty_edit_at(const char *p, int count, modem_info * info, int user) return total; } -/* - * Switch all modem-channels who are online and got a valid - * escape-sequence 1.5 seconds ago, to command-mode. - * This function is called every second via timer-interrupt from within - * timer-dispatcher isdn_timer_function() - */ -void -isdn_tty_modem_escape(void) -{ - int ton = 0; - int i; - int midx; - - for (i = 0; i < ISDN_MAX_CHANNELS; i++) - if (USG_MODEM(isdn_slot_usage(i))) - if ((midx = isdn_slot_m_idx(i)) >= 0) { - modem_info *info = &isdn_mdm.info[midx]; - if (info->online) { - ton = 1; - if ((info->emu.pluscount == 3) && - time_after(jiffies , info->emu.lastplus + PLUSWAIT2)) { - info->emu.pluscount = 0; - info->online = 0; - isdn_tty_modem_result(RESULT_OK, info); - } - } - } - isdn_timer_ctrl(ISDN_TIMER_MODEMPLUS, ton); -} - /* * Put a RING-message to all modem-channels who have the RI-bit set. * This function is called every second via timer-interrupt from within diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 060302c6a589..d0f53375bb54 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -98,7 +98,6 @@ ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \ (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2)) -extern void isdn_tty_modem_escape(void); extern void isdn_tty_modem_ring(void); extern void isdn_tty_carrier_timeout(void); extern void isdn_tty_modem_xmit(void); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index c5352e5d1194..a9067e07e325 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -242,12 +242,10 @@ typedef struct { #define ISDN_TIMER_RINGING 5 /* tty RINGs = ISDN_TIMER_1SEC * this factor */ #define ISDN_TIMER_KEEPINT 10 /* Cisco-Keepalive = ISDN_TIMER_1SEC * this factor */ #define ISDN_TIMER_MODEMREAD 1 -#define ISDN_TIMER_MODEMPLUS 2 #define ISDN_TIMER_MODEMRING 4 #define ISDN_TIMER_MODEMXMIT 8 #define ISDN_TIMER_CARRIER 256 /* Wait for Carrier */ -#define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMPLUS | \ - ISDN_TIMER_MODEMXMIT) +#define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMXMIT) #define ISDN_TIMER_SLOW (ISDN_TIMER_MODEMRING | ISDN_TIMER_CARRIER) /* GLOBAL_FLAGS */ @@ -363,6 +361,7 @@ typedef struct modem_info { #endif struct tty_struct *tty; /* Pointer to corresponding tty */ atemu emu; /* AT-emulator data */ + struct timer_list escape_timer; /* to recognize +++ escape */ struct termios normal_termios; /* For saving termios structs */ struct termios callout_termios; wait_queue_head_t open_wait, close_wait; -- cgit v1.2.3 From 5673f7e9efafbfc8506b9b4cba5d24ee45655645 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:58:11 -0600 Subject: ISDN: New timer handling for ttyI RING response Again, use a per ttyI timer handler for RING messages, only activated when used. --- drivers/isdn/i4l/isdn_ciscohdlck.c | 2 +- drivers/isdn/i4l/isdn_common.c | 6 ------ drivers/isdn/i4l/isdn_tty.c | 34 +++++++++++++++------------------- drivers/isdn/i4l/isdn_tty.h | 1 - include/linux/isdn.h | 6 ++---- 5 files changed, 18 insertions(+), 31 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_ciscohdlck.c b/drivers/isdn/i4l/isdn_ciscohdlck.c index e2a0c7541197..f8e903aa1b3c 100644 --- a/drivers/isdn/i4l/isdn_ciscohdlck.c +++ b/drivers/isdn/i4l/isdn_ciscohdlck.c @@ -226,7 +226,7 @@ isdn_ciscohdlck_connected(isdn_net_dev *idev) cisco->myseq = 0; cisco->mineseen = 0; cisco->yourseq = 0; - cisco->keepalive_period = ISDN_TIMER_KEEPINT; + cisco->keepalive_period = 10; cisco->last_slarp_in = 0; cisco->line_state = 0; cisco->debserint = 0; diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 238bd997dbde..9c7286a012b2 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1154,7 +1154,6 @@ isdn_dc2minor(int di, int ch) } static int isdn_timer_cnt2 = 0; -static int isdn_timer_cnt3 = 0; static void isdn_timer_funct(ulong dummy) @@ -1169,11 +1168,6 @@ isdn_timer_funct(ulong dummy) if (tf & ISDN_TIMER_SLOW) { if (++isdn_timer_cnt2 >= ISDN_TIMER_1SEC) { isdn_timer_cnt2 = 0; - if (++isdn_timer_cnt3 >= ISDN_TIMER_RINGING) { - isdn_timer_cnt3 = 0; - if (tf & ISDN_TIMER_MODEMRING) - isdn_tty_modem_ring(); - } if (tf & ISDN_TIMER_CARRIER) isdn_tty_carrier_timeout(); } diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 5635c9ff3658..9036643f351e 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -20,6 +20,7 @@ #define VBUFX (VBUF/16) #endif +#define RING_TIMEOUT (5*HZ) /* repeat RING every 5 secs */ #define FIX_FILE_TRANSFER #define DUMMY_HAYES_AT @@ -27,6 +28,7 @@ static int isdn_tty_edit_at(const char *, int, modem_info *, int); static void isdn_tty_escape_timer(unsigned long data); +static void isdn_tty_ring_timer(unsigned long data); static void isdn_tty_check_esc(struct modem_info *info, const unsigned char *p, int count); static void isdn_tty_modem_reset_regs(modem_info *, int); @@ -2133,6 +2135,9 @@ isdn_tty_init(void) init_timer(&info->escape_timer); info->escape_timer.data = (unsigned long) info; info->escape_timer.function = isdn_tty_escape_timer; + init_timer(&info->ring_timer); + info->ring_timer.data = (unsigned long) info; + info->ring_timer.function = isdn_tty_ring_timer; skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); @@ -2315,7 +2320,7 @@ isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup) info->line); info->msr |= UART_MSR_RI; isdn_tty_modem_result(RESULT_RING, info); - isdn_timer_ctrl(ISDN_TIMER_MODEMRING, 1); + mod_timer(&info->ring_timer, jiffies + RING_TIMEOUT); return 1; } } @@ -3980,27 +3985,18 @@ isdn_tty_edit_at(const char *p, int count, modem_info * info, int user) return total; } -/* - * Put a RING-message to all modem-channels who have the RI-bit set. - * This function is called every second via timer-interrupt from within - * timer-dispatcher isdn_timer_function() - */ -void -isdn_tty_modem_ring(void) +static void +isdn_tty_ring_timer(unsigned long data) { - int ton = 0; - int i; + struct modem_info *info = (struct modem_info *) data; - for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &isdn_mdm.info[i]; - if (info->msr & UART_MSR_RI) { - ton = 1; - isdn_tty_modem_result(RESULT_RING, info); - } - } - isdn_timer_ctrl(ISDN_TIMER_MODEMRING, ton); -} + if (!(info->msr & UART_MSR_RI)) + return; + isdn_tty_modem_result(RESULT_RING, info); + mod_timer(&info->ring_timer, jiffies + RING_TIMEOUT); +} + /* * For all online tty's, try sending data to * the lower levels. diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index d0f53375bb54..59638874f8ba 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -98,7 +98,6 @@ ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \ (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2)) -extern void isdn_tty_modem_ring(void); extern void isdn_tty_carrier_timeout(void); extern void isdn_tty_modem_xmit(void); extern int isdn_tty_init(void); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index a9067e07e325..25a9631d0bd5 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -239,14 +239,11 @@ typedef struct { #define ISDN_TIMER_RES 4 /* Main Timer-Resolution */ #define ISDN_TIMER_02SEC (HZ/ISDN_TIMER_RES/5) /* Slow-Timer1 .2 sec */ #define ISDN_TIMER_1SEC (HZ/ISDN_TIMER_RES) /* Slow-Timer2 1 sec */ -#define ISDN_TIMER_RINGING 5 /* tty RINGs = ISDN_TIMER_1SEC * this factor */ -#define ISDN_TIMER_KEEPINT 10 /* Cisco-Keepalive = ISDN_TIMER_1SEC * this factor */ #define ISDN_TIMER_MODEMREAD 1 -#define ISDN_TIMER_MODEMRING 4 #define ISDN_TIMER_MODEMXMIT 8 #define ISDN_TIMER_CARRIER 256 /* Wait for Carrier */ #define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMXMIT) -#define ISDN_TIMER_SLOW (ISDN_TIMER_MODEMRING | ISDN_TIMER_CARRIER) +#define ISDN_TIMER_SLOW (ISDN_TIMER_CARRIER) /* GLOBAL_FLAGS */ #define ISDN_GLOBAL_STOPPED 1 @@ -362,6 +359,7 @@ typedef struct modem_info { struct tty_struct *tty; /* Pointer to corresponding tty */ atemu emu; /* AT-emulator data */ struct timer_list escape_timer; /* to recognize +++ escape */ + struct timer_list ring_timer; /* for writing 'RING' responses */ struct termios normal_termios; /* For saving termios structs */ struct termios callout_termios; wait_queue_head_t open_wait, close_wait; -- cgit v1.2.3 From a4426b1ff253a43c99bc5eaac7325251db873237 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 08:59:40 -0600 Subject: ISDN: New timer handling for ttyI NO CARRIER response Again, use a per ttyI timer handler for NO CARRIER messages, only activated when used. --- drivers/isdn/i4l/isdn_common.c | 13 ------------- drivers/isdn/i4l/isdn_tty.c | 39 ++++++++++++++------------------------- drivers/isdn/i4l/isdn_tty.h | 1 - include/linux/isdn.h | 6 +----- 4 files changed, 15 insertions(+), 44 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 9c7286a012b2..e57624e24d56 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1153,8 +1153,6 @@ isdn_dc2minor(int di, int ch) return -1; } -static int isdn_timer_cnt2 = 0; - static void isdn_timer_funct(ulong dummy) { @@ -1165,13 +1163,6 @@ isdn_timer_funct(ulong dummy) if (tf & ISDN_TIMER_MODEMXMIT) isdn_tty_modem_xmit(); } - if (tf & ISDN_TIMER_SLOW) { - if (++isdn_timer_cnt2 >= ISDN_TIMER_1SEC) { - isdn_timer_cnt2 = 0; - if (tf & ISDN_TIMER_CARRIER) - isdn_tty_carrier_timeout(); - } - } if (tf) { unsigned long flags; @@ -1191,10 +1182,6 @@ isdn_timer_ctrl(int tf, int onoff) save_flags(flags); cli(); - if ((tf & ISDN_TIMER_SLOW) && (!(dev->tflags & ISDN_TIMER_SLOW))) { - /* If the slow-timer wasn't activated until now */ - isdn_timer_cnt2 = 0; - } old_tflags = dev->tflags; if (onoff) dev->tflags |= tf; diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 9036643f351e..abef4ba29e18 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -29,6 +29,7 @@ static int isdn_tty_edit_at(const char *, int, modem_info *, int); static void isdn_tty_escape_timer(unsigned long data); static void isdn_tty_ring_timer(unsigned long data); +static void isdn_tty_connect_timer(unsigned long data); static void isdn_tty_check_esc(struct modem_info *info, const unsigned char *p, int count); static void isdn_tty_modem_reset_regs(modem_info *, int); @@ -785,9 +786,8 @@ isdn_tty_dial(char *n, modem_info * info, atemu * m) } #endif info->dialing = 1; - info->emu.carrierwait = 0; isdn_slot_dial(info->isdn_slot, &dial); - isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1); + mod_timer(&info->connect_timer, jiffies + info->emu.mdmreg[REG_WAITC] * HZ); } } @@ -974,7 +974,7 @@ isdn_tty_resume(char *id, modem_info * info, atemu * m) // strcpy(dev->num[i], n); isdn_info_update(); isdn_slot_command(info->isdn_slot, CAPI_PUT_MESSAGE, &cmd); - isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1); + mod_timer(&info->connect_timer, jiffies + info->emu.mdmreg[REG_WAITC] * HZ); } } @@ -2138,6 +2138,9 @@ isdn_tty_init(void) init_timer(&info->ring_timer); info->ring_timer.data = (unsigned long) info; info->ring_timer.function = isdn_tty_ring_timer; + init_timer(&info->connect_timer); + info->connect_timer.data = (unsigned long) info; + info->connect_timer.function = isdn_tty_connect_timer; skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); @@ -3313,9 +3316,8 @@ isdn_tty_cmd_ATA(modem_info * info) #endif isdn_slot_command(info->isdn_slot, ISDN_CMD_SETL3, &cmd); info->dialing = 16; - info->emu.carrierwait = 0; isdn_slot_command(info->isdn_slot, ISDN_CMD_ACCEPTD, &cmd); - isdn_timer_ctrl(ISDN_TIMER_CARRIER, 1); + mod_timer(&info->connect_timer, jiffies + info->emu.mdmreg[REG_WAITC] * HZ); } else isdn_tty_modem_result(RESULT_NO_ANSWER, info); } @@ -4018,27 +4020,14 @@ isdn_tty_modem_xmit(void) isdn_timer_ctrl(ISDN_TIMER_MODEMXMIT, ton); } -/* - * Check all channels if we have a 'no carrier' timeout. - * Timeout value is set by Register S7. - */ -void -isdn_tty_carrier_timeout(void) +static void +isdn_tty_connect_timer(unsigned long data) { - int ton = 0; - int i; + struct modem_info *info = (struct modem_info *) data; - for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &isdn_mdm.info[i]; - if (info->dialing) { - if (info->emu.carrierwait++ > info->emu.mdmreg[REG_WAITC]) { - info->dialing = 0; - isdn_tty_modem_result(RESULT_NO_CARRIER, info); - isdn_tty_modem_hup(info, 1); - } - else - ton = 1; - } + if (info->dialing) { + info->dialing = 0; + isdn_tty_modem_result(RESULT_NO_CARRIER, info); + isdn_tty_modem_hup(info, 1); } - isdn_timer_ctrl(ISDN_TIMER_CARRIER, ton); } diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 59638874f8ba..cd2be9c4cc5f 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -98,7 +98,6 @@ ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \ (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2)) -extern void isdn_tty_carrier_timeout(void); extern void isdn_tty_modem_xmit(void); extern int isdn_tty_init(void); extern void isdn_tty_readmodem(void); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 25a9631d0bd5..5f8606e00601 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -237,13 +237,9 @@ typedef struct { /* Timer-delays and scheduling-flags */ #define ISDN_TIMER_RES 4 /* Main Timer-Resolution */ -#define ISDN_TIMER_02SEC (HZ/ISDN_TIMER_RES/5) /* Slow-Timer1 .2 sec */ -#define ISDN_TIMER_1SEC (HZ/ISDN_TIMER_RES) /* Slow-Timer2 1 sec */ #define ISDN_TIMER_MODEMREAD 1 #define ISDN_TIMER_MODEMXMIT 8 -#define ISDN_TIMER_CARRIER 256 /* Wait for Carrier */ #define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMXMIT) -#define ISDN_TIMER_SLOW (ISDN_TIMER_CARRIER) /* GLOBAL_FLAGS */ #define ISDN_GLOBAL_STOPPED 1 @@ -300,7 +296,6 @@ typedef struct atemu { int mdmcmdl; /* Length of Modem-Commandbuffer */ int pluscount; /* Counter for +++ sequence */ int lastplus; /* Timestamp of last + */ - int carrierwait; /* Seconds of carrier waiting */ char mdmcmd[255]; /* Modem-Commandbuffer */ unsigned int charge; /* Charge units of current connection */ } atemu; @@ -360,6 +355,7 @@ typedef struct modem_info { atemu emu; /* AT-emulator data */ struct timer_list escape_timer; /* to recognize +++ escape */ struct timer_list ring_timer; /* for writing 'RING' responses */ + struct timer_list connect_timer; /* waiting for CONNECT */ struct termios normal_termios; /* For saving termios structs */ struct termios callout_termios; wait_queue_head_t open_wait, close_wait; -- cgit v1.2.3 From 942e661203a2cb6f6bad3df5be2ad11b6121f350 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 09:00:20 -0600 Subject: ISDN: Remove delayed ttyI xmit There's really no good reason to delay sending out data on a ttyI, ISDN is slow enough anyway ;) (There is one reason, i.e. allowing to coalesce multiple chars, but that is better fixed by having the upper levels (tty) send larger buffers) --- drivers/isdn/i4l/isdn_common.c | 2 -- drivers/isdn/i4l/isdn_tty.c | 32 ++++++++------------------------ drivers/isdn/i4l/isdn_tty.h | 1 - include/linux/isdn.h | 3 +-- 4 files changed, 9 insertions(+), 29 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index e57624e24d56..168f5ff260e1 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1160,8 +1160,6 @@ isdn_timer_funct(ulong dummy) if (tf & ISDN_TIMER_FAST) { if (tf & ISDN_TIMER_MODEMREAD) isdn_tty_readmodem(); - if (tf & ISDN_TIMER_MODEMXMIT) - isdn_tty_modem_xmit(); } if (tf) { diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index abef4ba29e18..70f975b1349a 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -26,6 +26,7 @@ /* Prototypes */ +static void isdn_tty_modem_xmit(struct modem_info *info); static int isdn_tty_edit_at(const char *, int, modem_info *, int); static void isdn_tty_escape_timer(unsigned long data); static void isdn_tty_ring_timer(unsigned long data); @@ -1312,11 +1313,7 @@ isdn_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int co } atomic_dec(&info->xmit_lock); if ((info->xmit_count) || (skb_queue_len(&info->xmit_queue))) { - if (m->mdmreg[REG_DXMT] & BIT_DXMT) { - isdn_tty_senddown(info); - isdn_tty_tint(info); - } - isdn_timer_ctrl(ISDN_TIMER_MODEMXMIT, 1); + isdn_tty_modem_xmit(info); } out: if (from_user) @@ -1384,7 +1381,7 @@ isdn_tty_flush_chars(struct tty_struct *tty) if (isdn_tty_paranoia_check(info, tty->device, "isdn_tty_flush_chars")) return; if ((info->xmit_count) || (skb_queue_len(&info->xmit_queue))) - isdn_timer_ctrl(ISDN_TIMER_MODEMXMIT, 1); + isdn_tty_modem_xmit(info); } /* @@ -3999,25 +3996,11 @@ isdn_tty_ring_timer(unsigned long data) mod_timer(&info->ring_timer, jiffies + RING_TIMEOUT); } -/* - * For all online tty's, try sending data to - * the lower levels. - */ -void -isdn_tty_modem_xmit(void) +static void +isdn_tty_modem_xmit(struct modem_info *info) { - int ton = 1; - int i; - - for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - modem_info *info = &isdn_mdm.info[i]; - if (info->online) { - ton = 1; - isdn_tty_senddown(info); - isdn_tty_tint(info); - } - } - isdn_timer_ctrl(ISDN_TIMER_MODEMXMIT, ton); + isdn_tty_senddown(info); + isdn_tty_tint(info); } static void @@ -4031,3 +4014,4 @@ isdn_tty_connect_timer(unsigned long data) isdn_tty_modem_hup(info, 1); } } + diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index cd2be9c4cc5f..3265fb9fd323 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -98,7 +98,6 @@ ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \ (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2)) -extern void isdn_tty_modem_xmit(void); extern int isdn_tty_init(void); extern void isdn_tty_readmodem(void); extern int isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 5f8606e00601..f880d2581520 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -238,8 +238,7 @@ typedef struct { /* Timer-delays and scheduling-flags */ #define ISDN_TIMER_RES 4 /* Main Timer-Resolution */ #define ISDN_TIMER_MODEMREAD 1 -#define ISDN_TIMER_MODEMXMIT 8 -#define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMXMIT) +#define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD) /* GLOBAL_FLAGS */ #define ISDN_GLOBAL_STOPPED 1 -- cgit v1.2.3 From e6926b1210b14eb42095de4c87c28500556a4fc9 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 29 Oct 2002 09:01:08 -0600 Subject: ISDN: New timer handling for read timer Again, use a per ttyI timer handler to feed arrived data into the ttyI. Really, there shouldn't be the need for any timer at all, rather working flow control, but that'll take a bit to fix. --- drivers/isdn/i4l/isdn_audio.c | 6 +-- drivers/isdn/i4l/isdn_common.c | 40 ----------------- drivers/isdn/i4l/isdn_common.h | 1 - drivers/isdn/i4l/isdn_tty.c | 98 ++++++++++++++++++++---------------------- drivers/isdn/i4l/isdn_tty.h | 1 - include/linux/isdn.h | 7 +-- 6 files changed, 50 insertions(+), 103 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/i4l/isdn_audio.c b/drivers/isdn/i4l/isdn_audio.c index c4b828d13e9a..47b90e49b8d8 100644 --- a/drivers/isdn/i4l/isdn_audio.c +++ b/drivers/isdn/i4l/isdn_audio.c @@ -506,7 +506,7 @@ isdn_audio_goertzel(int *sample, modem_info * info) ((sk2 * sk2) >> AMP_BITS); } skb_queue_tail(&info->dtmf_queue, skb); - isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); + mod_timer(&info->read_timer, jiffies + 4); } void @@ -565,7 +565,7 @@ isdn_audio_eval_dtmf(modem_info * info) restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) - isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); + mod_timer(&info->read_timer, jiffies + 4); } else kfree_skb(skb); s->last = what; @@ -680,7 +680,7 @@ isdn_audio_put_dle_code(modem_info * info, u_char code) restore_flags(flags); /* Schedule dequeuing */ if ((dev->modempoll) && (info->rcvsched)) - isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); + mod_timer(&info->read_timer, jiffies + 4); } void diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index 168f5ff260e1..ff0f63576bb0 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1153,43 +1153,6 @@ isdn_dc2minor(int di, int ch) return -1; } -static void -isdn_timer_funct(ulong dummy) -{ - int tf = dev->tflags; - if (tf & ISDN_TIMER_FAST) { - if (tf & ISDN_TIMER_MODEMREAD) - isdn_tty_readmodem(); - } - if (tf) - { - unsigned long flags; - - save_flags(flags); - cli(); - mod_timer(&dev->timer, jiffies+ISDN_TIMER_RES); - restore_flags(flags); - } -} - -void -isdn_timer_ctrl(int tf, int onoff) -{ - unsigned long flags; - int old_tflags; - - save_flags(flags); - cli(); - old_tflags = dev->tflags; - if (onoff) - dev->tflags |= tf; - else - dev->tflags &= ~tf; - if (dev->tflags && !old_tflags) - mod_timer(&dev->timer, jiffies+ISDN_TIMER_RES); - restore_flags(flags); -} - static int __drv_command(struct isdn_driver *drv, isdn_ctrl *c) { @@ -2366,8 +2329,6 @@ static int __init isdn_init(void) goto err_drv_fsm; } memset(dev, 0, sizeof(*dev)); - init_timer(&dev->timer); - dev->timer.function = isdn_timer_funct; init_MUTEX(&dev->sem); init_waitqueue_head(&dev->info_waitq); for (i = 0; i < ISDN_MAX_CHANNELS; i++) { @@ -2435,7 +2396,6 @@ static void __exit isdn_exit(void) isdn_tty_exit(); unregister_chrdev(ISDN_MAJOR, "isdn"); isdn_cleanup_devfs(); - del_timer_sync(&dev->timer); vfree(dev); fsm_free(&drv_fsm); fsm_free(&slot_fsm); diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h index 294c17956f39..ebed1119eb25 100644 --- a/drivers/isdn/i4l/isdn_common.h +++ b/drivers/isdn/i4l/isdn_common.h @@ -60,7 +60,6 @@ extern void isdn_unlock_drivers(void); extern void isdn_free_channel(int di, int ch, int usage); extern void isdn_info_update(void); extern char *isdn_map_eaz2msn(char *msn, int di); -extern void isdn_timer_ctrl(int tf, int onoff); extern int isdn_getnum(char **); extern int isdn_msncmp( const char *, const char *); #if defined(ISDN_DEBUG_NET_DUMP) || defined(ISDN_DEBUG_MODEM_DUMP) diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 70f975b1349a..93c9f986025d 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c @@ -229,61 +229,53 @@ isdn_tty_readbchan(struct modem_info *info, u_char * buf, u_char * fp, int len) * It tries getting received data from the receive queue an stuff it into * the tty's flip-buffer. */ -void -isdn_tty_readmodem(void) +static void +isdn_tty_readmodem(unsigned long data) { - int resched = 0; - int midx; - int i; + struct modem_info *info = (struct modem_info *) data; int c; int r; ulong flags; struct tty_struct *tty; - modem_info *info; - for (i = 0; i < ISDN_MAX_CHANNELS; i++) { - if ((midx = isdn_slot_m_idx(i)) >= 0) { - info = &isdn_mdm.info[midx]; - if (info->online) { - r = 0; + if (!info->online) + return; + + r = 0; #ifdef CONFIG_ISDN_AUDIO - isdn_audio_eval_dtmf(info); - if ((info->vonline & 1) && (info->emu.vpar[1])) - isdn_audio_eval_silence(info); -#endif - if ((tty = info->tty)) { - if (info->mcr & UART_MCR_RTS) { - c = TTY_FLIPBUF_SIZE - tty->flip.count; - if (c > 0) { - save_flags(flags); - cli(); - r = isdn_tty_readbchan(info, - tty->flip.char_buf_ptr, - tty->flip.flag_buf_ptr, c); - /* CISCO AsyncPPP Hack */ - if (!(info->emu.mdmreg[REG_CPPP] & BIT_CPPP)) - memset(tty->flip.flag_buf_ptr, 0, r); - tty->flip.count += r; - tty->flip.flag_buf_ptr += r; - tty->flip.char_buf_ptr += r; - if (r) - schedule_delayed_work(&tty->flip.work, 1); - restore_flags(flags); - } - } else - r = 1; - } else - r = 1; - if (r) { - info->rcvsched = 0; - resched = 1; - } else - info->rcvsched = 1; + isdn_audio_eval_dtmf(info); + if ((info->vonline & 1) && (info->emu.vpar[1])) + isdn_audio_eval_silence(info); +#endif + if ((tty = info->tty)) { + if (info->mcr & UART_MCR_RTS) { + c = TTY_FLIPBUF_SIZE - tty->flip.count; + if (c > 0) { + save_flags(flags); + cli(); + r = isdn_tty_readbchan(info, + tty->flip.char_buf_ptr, + tty->flip.flag_buf_ptr, c); + /* CISCO AsyncPPP Hack */ + if (!(info->emu.mdmreg[REG_CPPP] & BIT_CPPP)) + memset(tty->flip.flag_buf_ptr, 0, r); + tty->flip.count += r; + tty->flip.flag_buf_ptr += r; + tty->flip.char_buf_ptr += r; + if (r) + schedule_delayed_work(&tty->flip.work, 1); + restore_flags(flags); } - } - } - if (!resched) - isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 0); + } else + r = 1; + } else + r = 1; + + if (r) { + info->rcvsched = 0; + mod_timer(&info->read_timer, jiffies + 4); + } else + info->rcvsched = 1; } static int @@ -393,8 +385,8 @@ isdn_tty_rcv_skb(struct isdn_slot *slot, struct sk_buff *skb) ); restore_flags(flags); /* Schedule dequeuing */ - if ((dev->modempoll) && (info->rcvsched)) - isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); + if (dev->modempoll && info->rcvsched) + mod_timer(&info->read_timer, jiffies + 4); return 1; } @@ -2138,6 +2130,9 @@ isdn_tty_init(void) init_timer(&info->connect_timer); info->connect_timer.data = (unsigned long) info; info->connect_timer.function = isdn_tty_connect_timer; + init_timer(&info->read_timer); + info->read_timer.data = (unsigned long) info; + info->read_timer.function = isdn_tty_readmodem; skb_queue_head_init(&info->rpqueue); info->xmit_size = ISDN_SERIAL_XMIT_SIZE; skb_queue_head_init(&info->xmit_queue); @@ -2570,9 +2565,8 @@ isdn_tty_at_cout(char *msg, modem_info * info) isdn_tty_queue_tail(info, skb, skb->len); restore_flags(flags); /* Schedule dequeuing */ - if ((dev->modempoll) && (info->rcvsched)) - isdn_timer_ctrl(ISDN_TIMER_MODEMREAD, 1); - + if (dev->modempoll && info->rcvsched) + mod_timer(&info->read_timer, jiffies + 4); } else { restore_flags(flags); schedule_delayed_work(&tty->flip.work, 1); diff --git a/drivers/isdn/i4l/isdn_tty.h b/drivers/isdn/i4l/isdn_tty.h index 3265fb9fd323..2a902f74b586 100644 --- a/drivers/isdn/i4l/isdn_tty.h +++ b/drivers/isdn/i4l/isdn_tty.h @@ -99,7 +99,6 @@ (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2)) extern int isdn_tty_init(void); -extern void isdn_tty_readmodem(void); extern int isdn_tty_find_icall(struct isdn_slot *slot, setup_parm *setup); extern void isdn_tty_cleanup_xmit(modem_info *); extern int isdn_tty_capi_facility(capi_msg *cm); diff --git a/include/linux/isdn.h b/include/linux/isdn.h index f880d2581520..2f429e27a007 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -235,11 +235,6 @@ typedef struct { #define USG_MODEMORVOICE(x) (((x & ISDN_USAGE_MASK)==ISDN_USAGE_MODEM) || \ ((x & ISDN_USAGE_MASK)==ISDN_USAGE_VOICE) ) -/* Timer-delays and scheduling-flags */ -#define ISDN_TIMER_RES 4 /* Main Timer-Resolution */ -#define ISDN_TIMER_MODEMREAD 1 -#define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD) - /* GLOBAL_FLAGS */ #define ISDN_GLOBAL_STOPPED 1 @@ -355,6 +350,7 @@ typedef struct modem_info { struct timer_list escape_timer; /* to recognize +++ escape */ struct timer_list ring_timer; /* for writing 'RING' responses */ struct timer_list connect_timer; /* waiting for CONNECT */ + struct timer_list read_timer; /* read incoming data */ struct termios normal_termios; /* For saving termios structs */ struct termios callout_termios; wait_queue_head_t open_wait, close_wait; @@ -409,7 +405,6 @@ typedef struct isdn_devt { int global_flags; infostruct *infochain; /* List of open info-devs. */ wait_queue_head_t info_waitq; /* Wait-Queue for isdninfo */ - struct timer_list timer; /* Misc.-function Timer */ struct task_struct *profd; /* For iprofd */ struct semaphore sem; /* serialize list access*/ unsigned long global_features; -- cgit v1.2.3 From 63bc762f9bdca7bdbef44bd6a1c0e2936f4c5096 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Tue, 29 Oct 2002 07:43:32 -0800 Subject: [PATCH] USB: clean up usb structures some more This patch splits up the usb structures to have two structs, "usb_XXX_descriptor" with just the descriptor, and "usb_host_XXX" (or something similar) to wrap it and add the "extra" pointers plus the array of related descriptors that the host parsed during enumeration. (2 or 3 words extra in each"usb_host_XXX".) This further matches the "on the wire" data and enables the gadget drivers to share the same header file. Covers all the linux/drivers/usb/* and linux/sound/usb/* stuff, but not a handful of other drivers (bluetooth, iforce, hisax, irda) that are out of the usb tree and will likely be affected. --- drivers/usb/class/audio.c | 111 +++++++++++++++++++++------------------- drivers/usb/class/bluetty.c | 8 +-- drivers/usb/class/cdc-acm.c | 30 ++++++----- drivers/usb/class/usb-midi.c | 28 +++++----- drivers/usb/class/usblp.c | 24 ++++----- drivers/usb/core/config.c | 89 ++++++++++++++++++-------------- drivers/usb/core/devices.c | 16 +++--- drivers/usb/core/devio.c | 19 +++---- drivers/usb/core/driverfs.c | 8 +-- drivers/usb/core/hub.c | 20 ++++---- drivers/usb/core/message.c | 49 +++++++++--------- drivers/usb/core/usb-debug.c | 18 +++---- drivers/usb/core/usb.c | 50 ++++++++++-------- drivers/usb/image/hpusbscsi.c | 20 ++++---- drivers/usb/image/mdc800.c | 18 +++---- drivers/usb/image/microtek.c | 18 +++---- drivers/usb/image/scanner.c | 14 ++--- drivers/usb/input/aiptek.c | 2 +- drivers/usb/input/hid-core.c | 16 +++--- drivers/usb/input/powermate.c | 6 +-- drivers/usb/input/usbkbd.c | 8 +-- drivers/usb/input/usbmouse.c | 6 +-- drivers/usb/input/wacom.c | 2 +- drivers/usb/input/xpad.c | 2 +- drivers/usb/media/dabusb.c | 4 +- drivers/usb/media/ibmcam.c | 10 ++-- drivers/usb/media/konicawc.c | 20 ++++---- drivers/usb/media/ov511.c | 4 +- drivers/usb/media/pwc-if.c | 14 ++--- drivers/usb/media/se401.c | 2 +- drivers/usb/media/ultracam.c | 16 +++--- drivers/usb/media/vicam.c | 6 +-- drivers/usb/misc/auerswald.c | 2 +- drivers/usb/misc/brlvger.c | 8 +-- drivers/usb/misc/tiglusb.c | 4 +- drivers/usb/misc/usbtest.c | 30 +++++------ drivers/usb/net/catc.c | 3 +- drivers/usb/net/cdc-ether.c | 48 ++++++++--------- drivers/usb/net/kaweth.c | 2 +- drivers/usb/net/pegasus.c | 2 +- drivers/usb/net/rtl8150.c | 2 +- drivers/usb/net/usbnet.c | 6 +-- drivers/usb/serial/usb-serial.c | 8 +-- drivers/usb/storage/scsiglue.c | 2 +- drivers/usb/storage/usb.c | 27 +++++----- drivers/usb/usb-skeleton.c | 2 +- include/linux/usb.h | 94 +++++++++++++--------------------- include/linux/usb_ch9.h | 91 +++++++++++++++++++++++++++++--- sound/usb/usbaudio.c | 60 +++++++++++----------- sound/usb/usbmidi.c | 38 +++++++------- 50 files changed, 589 insertions(+), 498 deletions(-) (limited to 'include/linux') diff --git a/drivers/usb/class/audio.c b/drivers/usb/class/audio.c index 3287d9a3d7bb..4517d61f925d 100644 --- a/drivers/usb/class/audio.c +++ b/drivers/usb/class/audio.c @@ -1512,8 +1512,8 @@ static int find_format(struct audioformat *afp, unsigned int nr, unsigned int fm static int set_format_in(struct usb_audiodev *as) { struct usb_device *dev = as->state->usbdev; - struct usb_config_descriptor *config = dev->actconfig; - struct usb_interface_descriptor *alts; + struct usb_host_config *config = dev->actconfig; + struct usb_host_interface *alts; struct usb_interface *iface; struct usbin *u = &as->usbin; struct dmabuf *d = &u->dma; @@ -1522,7 +1522,7 @@ static int set_format_in(struct usb_audiodev *as) unsigned char data[3]; int fmtnr, ret; - if (u->interface < 0 || u->interface >= config->bNumInterfaces) + if (u->interface < 0 || u->interface >= config->desc.bNumInterfaces) return 0; iface = &config->interface[u->interface]; @@ -1535,26 +1535,26 @@ static int set_format_in(struct usb_audiodev *as) fmt = as->fmtin + fmtnr; alts = &iface->altsetting[fmt->altsetting]; u->format = fmt->format; - u->datapipe = usb_rcvisocpipe(dev, alts->endpoint[0].bEndpointAddress & 0xf); + u->datapipe = usb_rcvisocpipe(dev, alts->endpoint[0].desc.bEndpointAddress & 0xf); u->syncpipe = u->syncinterval = 0; - if ((alts->endpoint[0].bmAttributes & 0x0c) == 0x08) { - if (alts->bNumEndpoints < 2 || - alts->endpoint[1].bmAttributes != 0x01 || - alts->endpoint[1].bSynchAddress != 0 || - alts->endpoint[1].bEndpointAddress != (alts->endpoint[0].bSynchAddress & 0x7f)) { + if ((alts->endpoint[0].desc.bmAttributes & 0x0c) == 0x08) { + if (alts->desc.bNumEndpoints < 2 || + alts->endpoint[1].desc.bmAttributes != 0x01 || + alts->endpoint[1].desc.bSynchAddress != 0 || + alts->endpoint[1].desc.bEndpointAddress != (alts->endpoint[0].desc.bSynchAddress & 0x7f)) { printk(KERN_ERR "usbaudio: device %d interface %d altsetting %d invalid synch pipe\n", dev->devnum, u->interface, fmt->altsetting); return -1; } - u->syncpipe = usb_sndisocpipe(dev, alts->endpoint[1].bEndpointAddress & 0xf); - u->syncinterval = alts->endpoint[1].bRefresh; + u->syncpipe = usb_sndisocpipe(dev, alts->endpoint[1].desc.bEndpointAddress & 0xf); + u->syncinterval = alts->endpoint[1].desc.bRefresh; } if (d->srate < fmt->sratelo) d->srate = fmt->sratelo; if (d->srate > fmt->sratehi) d->srate = fmt->sratehi; - dprintk((KERN_DEBUG "usbaudio: set_format_in: usb_set_interface %u %u\n", alts->bInterfaceNumber, fmt->altsetting)); - if (usb_set_interface(dev, alts->bInterfaceNumber, fmt->altsetting) < 0) { + dprintk((KERN_DEBUG "usbaudio: set_format_in: usb_set_interface %u %u\n", alts->desc.bInterfaceNumber, fmt->altsetting)); + if (usb_set_interface(dev, alts->desc.bInterfaceNumber, fmt->altsetting) < 0) { printk(KERN_WARNING "usbaudio: usb_set_interface failed, device %d interface %d altsetting %d\n", dev->devnum, u->interface, fmt->altsetting); return -1; @@ -1600,8 +1600,8 @@ static int set_format_in(struct usb_audiodev *as) static int set_format_out(struct usb_audiodev *as) { struct usb_device *dev = as->state->usbdev; - struct usb_config_descriptor *config = dev->actconfig; - struct usb_interface_descriptor *alts; + struct usb_host_config *config = dev->actconfig; + struct usb_host_interface *alts; struct usb_interface *iface; struct usbout *u = &as->usbout; struct dmabuf *d = &u->dma; @@ -1610,7 +1610,7 @@ static int set_format_out(struct usb_audiodev *as) unsigned char data[3]; int fmtnr, ret; - if (u->interface < 0 || u->interface >= config->bNumInterfaces) + if (u->interface < 0 || u->interface >= config->desc.bNumInterfaces) return 0; iface = &config->interface[u->interface]; @@ -1623,9 +1623,9 @@ static int set_format_out(struct usb_audiodev *as) fmt = as->fmtout + fmtnr; u->format = fmt->format; alts = &iface->altsetting[fmt->altsetting]; - u->datapipe = usb_sndisocpipe(dev, alts->endpoint[0].bEndpointAddress & 0xf); + u->datapipe = usb_sndisocpipe(dev, alts->endpoint[0].desc.bEndpointAddress & 0xf); u->syncpipe = u->syncinterval = 0; - if ((alts->endpoint[0].bmAttributes & 0x0c) == 0x04) { + if ((alts->endpoint[0].desc.bmAttributes & 0x0c) == 0x04) { #if 0 printk(KERN_DEBUG "bNumEndpoints 0x%02x endpoint[1].bmAttributes 0x%02x\n" KERN_DEBUG "endpoint[1].bSynchAddress 0x%02x endpoint[1].bEndpointAddress 0x%02x\n" @@ -1633,22 +1633,22 @@ static int set_format_out(struct usb_audiodev *as) alts->endpoint[1].bmAttributes, alts->endpoint[1].bSynchAddress, alts->endpoint[1].bEndpointAddress, alts->endpoint[0].bSynchAddress); #endif - if (alts->bNumEndpoints < 2 || - alts->endpoint[1].bmAttributes != 0x01 || - alts->endpoint[1].bSynchAddress != 0 || - alts->endpoint[1].bEndpointAddress != (alts->endpoint[0].bSynchAddress | 0x80)) { + if (alts->desc.bNumEndpoints < 2 || + alts->endpoint[1].desc.bmAttributes != 0x01 || + alts->endpoint[1].desc.bSynchAddress != 0 || + alts->endpoint[1].desc.bEndpointAddress != (alts->endpoint[0].desc.bSynchAddress | 0x80)) { printk(KERN_ERR "usbaudio: device %d interface %d altsetting %d invalid synch pipe\n", dev->devnum, u->interface, fmt->altsetting); return -1; } - u->syncpipe = usb_rcvisocpipe(dev, alts->endpoint[1].bEndpointAddress & 0xf); - u->syncinterval = alts->endpoint[1].bRefresh; + u->syncpipe = usb_rcvisocpipe(dev, alts->endpoint[1].desc.bEndpointAddress & 0xf); + u->syncinterval = alts->endpoint[1].desc.bRefresh; } if (d->srate < fmt->sratelo) d->srate = fmt->sratelo; if (d->srate > fmt->sratehi) d->srate = fmt->sratehi; - dprintk((KERN_DEBUG "usbaudio: set_format_out: usb_set_interface %u %u\n", alts->bInterfaceNumber, fmt->altsetting)); + dprintk((KERN_DEBUG "usbaudio: set_format_out: usb_set_interface %u %u\n", alts->desc.bInterfaceNumber, fmt->altsetting)); if (usb_set_interface(dev, u->interface, fmt->altsetting) < 0) { printk(KERN_WARNING "usbaudio: usb_set_interface failed, device %d interface %d altsetting %d\n", dev->devnum, u->interface, fmt->altsetting); @@ -2705,7 +2705,7 @@ static int usb_audio_release(struct inode *inode, struct file *file) usbout_stop(as); if (dev && as->usbout.interface >= 0) { iface = &dev->actconfig->interface[as->usbout.interface]; - usb_set_interface(dev, iface->altsetting->bInterfaceNumber, 0); + usb_set_interface(dev, iface->altsetting->desc.bInterfaceNumber, 0); } dmabuf_release(&as->usbout.dma); usbout_release(as); @@ -2714,7 +2714,7 @@ static int usb_audio_release(struct inode *inode, struct file *file) usbin_stop(as); if (dev && as->usbin.interface >= 0) { iface = &dev->actconfig->interface[as->usbin.interface]; - usb_set_interface(dev, iface->altsetting->bInterfaceNumber, 0); + usb_set_interface(dev, iface->altsetting->desc.bInterfaceNumber, 0); } dmabuf_release(&as->usbin.dma); usbin_release(as); @@ -2819,8 +2819,8 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b { struct usb_device *dev = s->usbdev; struct usb_audiodev *as; - struct usb_config_descriptor *config = dev->actconfig; - struct usb_interface_descriptor *alts; + struct usb_host_config *config = dev->actconfig; + struct usb_host_interface *alts; struct usb_interface *iface; struct audioformat *fp; unsigned char *fmt, *csep; @@ -2868,17 +2868,17 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b iface = &config->interface[asifin]; for (i = 0; i < iface->num_altsetting; i++) { alts = &iface->altsetting[i]; - if (alts->bInterfaceClass != USB_CLASS_AUDIO || alts->bInterfaceSubClass != 2) + if (alts->desc.bInterfaceClass != USB_CLASS_AUDIO || alts->desc.bInterfaceSubClass != 2) continue; - if (alts->bNumEndpoints < 1) { + if (alts->desc.bNumEndpoints < 1) { if (i != 0) { /* altsetting 0 has no endpoints (Section B.3.4.1) */ printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u does not have an endpoint\n", dev->devnum, asifin, i); } continue; } - if ((alts->endpoint[0].bmAttributes & 0x03) != 0x01 || - !(alts->endpoint[0].bEndpointAddress & 0x80)) { + if ((alts->endpoint[0].desc.bmAttributes & 0x03) != 0x01 || + !(alts->endpoint[0].desc.bEndpointAddress & 0x80)) { printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u first endpoint not isochronous in\n", dev->devnum, asifin, i); continue; @@ -2949,15 +2949,15 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b iface = &config->interface[asifout]; for (i = 0; i < iface->num_altsetting; i++) { alts = &iface->altsetting[i]; - if (alts->bInterfaceClass != USB_CLASS_AUDIO || alts->bInterfaceSubClass != 2) + if (alts->desc.bInterfaceClass != USB_CLASS_AUDIO || alts->desc.bInterfaceSubClass != 2) continue; - if (alts->bNumEndpoints < 1) { + if (alts->desc.bNumEndpoints < 1) { printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u does not have an endpoint\n", dev->devnum, asifout, i); continue; } - if ((alts->endpoint[0].bmAttributes & 0x03) != 0x01 || - (alts->endpoint[0].bEndpointAddress & 0x80)) { + if ((alts->endpoint[0].desc.bmAttributes & 0x03) != 0x01 || + (alts->endpoint[0].desc.bEndpointAddress & 0x80)) { printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u first endpoint not isochronous out\n", dev->devnum, asifout, i); continue; @@ -3642,10 +3642,13 @@ static void usb_audio_constructmixer(struct usb_audio_state *s, unsigned char *b list_add_tail(&ms->list, &s->mixerlist); } +/* arbitrary limit, we won't check more interfaces than this */ +#define USB_MAXINTERFACES 32 + static struct usb_audio_state *usb_audio_parsecontrol(struct usb_device *dev, unsigned char *buffer, unsigned int buflen, unsigned int ctrlif) { struct usb_audio_state *s; - struct usb_config_descriptor *config = dev->actconfig; + struct usb_host_config *config = dev->actconfig; struct usb_interface *iface; unsigned char ifin[USB_MAXINTERFACES], ifout[USB_MAXINTERFACES]; unsigned char *p1; @@ -3675,23 +3678,23 @@ static struct usb_audio_state *usb_audio_parsecontrol(struct usb_device *dev, un dev->devnum, ctrlif); for (i = 0; i < p1[7]; i++) { j = p1[8+i]; - if (j >= config->bNumInterfaces) { + if (j >= config->desc.bNumInterfaces) { printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u does not exist\n", dev->devnum, ctrlif, j); continue; } iface = &config->interface[j]; - if (iface->altsetting[0].bInterfaceClass != USB_CLASS_AUDIO) { + if (iface->altsetting[0].desc.bInterfaceClass != USB_CLASS_AUDIO) { printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u is not an AudioClass interface\n", dev->devnum, ctrlif, j); continue; } - if (iface->altsetting[0].bInterfaceSubClass == 3) { + if (iface->altsetting[0].desc.bInterfaceSubClass == 3) { printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u interface %u MIDIStreaming not supported\n", dev->devnum, ctrlif, j); continue; } - if (iface->altsetting[0].bInterfaceSubClass != 2) { + if (iface->altsetting[0].desc.bInterfaceSubClass != 2) { printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u invalid AudioClass subtype\n", dev->devnum, ctrlif, j); continue; @@ -3704,25 +3707,25 @@ static struct usb_audio_state *usb_audio_parsecontrol(struct usb_device *dev, un printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u has only 1 altsetting.\n", dev->devnum, ctrlif); continue; } - if (iface->altsetting[0].bNumEndpoints > 0) { + if (iface->altsetting[0].desc.bNumEndpoints > 0) { /* Check all endpoints; should they all have a bandwidth of 0 ? */ - for (k = 0; k < iface->altsetting[0].bNumEndpoints; k++) { - if (iface->altsetting[0].endpoint[k].wMaxPacketSize > 0) { + for (k = 0; k < iface->altsetting[0].desc.bNumEndpoints; k++) { + if (iface->altsetting[0].endpoint[k].desc.wMaxPacketSize > 0) { printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u endpoint %d does not have 0 bandwidth at alt[0]\n", dev->devnum, ctrlif, k); break; } } - if (k < iface->altsetting[0].bNumEndpoints) + if (k < iface->altsetting[0].desc.bNumEndpoints) continue; } - if (iface->altsetting[1].bNumEndpoints < 1) { + if (iface->altsetting[1].desc.bNumEndpoints < 1) { printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u has no endpoint\n", dev->devnum, ctrlif, j); continue; } /* note: this requires the data endpoint to be ep0 and the optional sync ep to be ep1, which seems to be the case */ - if (iface->altsetting[1].endpoint[0].bEndpointAddress & USB_DIR_IN) { + if (iface->altsetting[1].endpoint[0].desc.bEndpointAddress & USB_DIR_IN) { if (numifin < USB_MAXINTERFACES) { ifin[numifin++] = j; usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1); @@ -3769,7 +3772,7 @@ static int usb_audio_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev (intf); - struct usb_config_descriptor *config = dev->actconfig; + struct usb_host_config *config = dev->actconfig; struct usb_audio_state *s; unsigned char *buffer; unsigned char buf[8]; @@ -3778,8 +3781,8 @@ static int usb_audio_probe(struct usb_interface *intf, #if 0 printk(KERN_DEBUG "usbaudio: Probing if %i: IC %x, ISC %x\n", ifnum, - config->interface[ifnum].altsetting[0].bInterfaceClass, - config->interface[ifnum].altsetting[0].bInterfaceSubClass); + config->interface[ifnum].altsetting[0].desc.bInterfaceClass, + config->interface[ifnum].altsetting[0].desc.bInterfaceSubClass); #endif /* @@ -3788,8 +3791,8 @@ static int usb_audio_probe(struct usb_interface *intf, */ i = dev->actconfig - config; - if (usb_set_configuration(dev, config->bConfigurationValue) < 0) { - printk(KERN_ERR "usbaudio: set_configuration failed (ConfigValue 0x%x)\n", config->bConfigurationValue); + if (usb_set_configuration(dev, config->desc.bConfigurationValue) < 0) { + printk(KERN_ERR "usbaudio: set_configuration failed (ConfigValue 0x%x)\n", config->desc.bConfigurationValue); return -EIO; } ret = usb_get_descriptor(dev, USB_DT_CONFIG, i, buf, 8); @@ -3810,7 +3813,7 @@ static int usb_audio_probe(struct usb_interface *intf, printk(KERN_ERR "usbaudio: cannot get config descriptor %d of device %d (error %d)\n", i, dev->devnum, ret); return -EIO; } - s = usb_audio_parsecontrol(dev, buffer, buflen, intf->altsetting->bInterfaceNumber); + s = usb_audio_parsecontrol(dev, buffer, buflen, intf->altsetting->desc.bInterfaceNumber); if (s) { dev_set_drvdata (&intf->dev, s); return 0; diff --git a/drivers/usb/class/bluetty.c b/drivers/usb/class/bluetty.c index bf41336639ec..9f2c5bf28cd2 100644 --- a/drivers/usb/class/bluetty.c +++ b/drivers/usb/class/bluetty.c @@ -1053,7 +1053,7 @@ static int usb_bluetooth_probe (struct usb_interface *intf, { struct usb_device *dev = interface_to_usbdev (intf); struct usb_bluetooth *bluetooth = NULL; - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct usb_endpoint_descriptor *interrupt_in_endpoint[8]; struct usb_endpoint_descriptor *bulk_in_endpoint[8]; @@ -1068,11 +1068,11 @@ static int usb_bluetooth_probe (struct usb_interface *intf, int num_bulk_out = 0; interface = &intf->altsetting[0]; - control_out_endpoint = interface->bInterfaceNumber; + control_out_endpoint = interface->desc.bInterfaceNumber; /* find the endpoints that we need */ - for (i = 0; i < interface->bNumEndpoints; ++i) { - endpoint = &interface->endpoint[i]; + for (i = 0; i < interface->desc.bNumEndpoints; ++i) { + endpoint = &interface->endpoint[i].desc; if ((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x02)) { diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 2fbef5d86af6..16e189285585 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -166,7 +166,9 @@ static struct acm *acm_table[ACM_TTY_MINORS]; static int acm_ctrl_msg(struct acm *acm, int request, int value, void *buf, int len) { int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0), - request, USB_RT_ACM, value, acm->iface[0].altsetting[0].bInterfaceNumber, buf, len, HZ * 5); + request, USB_RT_ACM, value, + acm->iface[0].altsetting[0].desc.bInterfaceNumber, + buf, len, HZ * 5); dbg("acm_control_msg: rq: 0x%02x val: %#x len: %#x result: %d", request, value, len, retval); return retval < 0 ? retval : 0; } @@ -528,8 +530,8 @@ static int acm_probe (struct usb_interface *intf, { struct usb_device *dev; struct acm *acm; - struct usb_config_descriptor *cfacm; - struct usb_interface_descriptor *ifcom, *ifdata; + struct usb_host_config *cfacm; + struct usb_host_interface *ifcom, *ifdata; struct usb_endpoint_descriptor *epctrl, *epread, *epwrite; int readsize, ctrlsize, minor, i; unsigned char *buf; @@ -541,7 +543,7 @@ static int acm_probe (struct usb_interface *intf, dbg("probing config %d", cfacm->bConfigurationValue); - if (cfacm->bNumInterfaces != 2 || + if (cfacm->desc.bNumInterfaces != 2 || usb_interface_claimed(cfacm->interface + 0) || usb_interface_claimed(cfacm->interface + 1)) continue; @@ -549,20 +551,20 @@ static int acm_probe (struct usb_interface *intf, ifcom = cfacm->interface[0].altsetting + 0; ifdata = cfacm->interface[1].altsetting + 0; - if (ifdata->bInterfaceClass != 10 || ifdata->bNumEndpoints < 2) { + if (ifdata->desc.bInterfaceClass != 10 || ifdata->desc.bNumEndpoints < 2) { ifcom = cfacm->interface[1].altsetting + 0; ifdata = cfacm->interface[0].altsetting + 0; - if (ifdata->bInterfaceClass != 10 || ifdata->bNumEndpoints < 2) + if (ifdata->desc.bInterfaceClass != 10 || ifdata->desc.bNumEndpoints < 2) continue; } - if (ifcom->bInterfaceClass != 2 || ifcom->bInterfaceSubClass != 2 || - ifcom->bInterfaceProtocol != 1 || ifcom->bNumEndpoints < 1) + if (ifcom->desc.bInterfaceClass != 2 || ifcom->desc.bInterfaceSubClass != 2 || + ifcom->desc.bInterfaceProtocol != 1 || ifcom->desc.bNumEndpoints < 1) continue; - epctrl = ifcom->endpoint + 0; - epread = ifdata->endpoint + 0; - epwrite = ifdata->endpoint + 1; + epctrl = &ifcom->endpoint[0].desc; + epread = &ifdata->endpoint[0].desc; + epwrite = &ifdata->endpoint[1].desc; if ((epctrl->bEndpointAddress & 0x80) != 0x80 || (epctrl->bmAttributes & 3) != 3 || (epread->bmAttributes & 3) != 2 || (epwrite->bmAttributes & 3) != 2 || @@ -570,11 +572,11 @@ static int acm_probe (struct usb_interface *intf, continue; if ((epread->bEndpointAddress & 0x80) != 0x80) { - epread = ifdata->endpoint + 1; - epwrite = ifdata->endpoint + 0; + epread = &ifdata->endpoint[1].desc; + epwrite = &ifdata->endpoint[0].desc; } - usb_set_configuration(dev, cfacm->bConfigurationValue); + usb_set_configuration(dev, cfacm->desc.bConfigurationValue); for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++); if (acm_table[minor]) { diff --git a/drivers/usb/class/usb-midi.c b/drivers/usb/class/usb-midi.c index fdeea3ec0bb0..586808aa0f4d 100644 --- a/drivers/usb/class/usb-midi.c +++ b/drivers/usb/class/usb-midi.c @@ -1519,7 +1519,7 @@ static int on_bits( unsigned short v ) static int get_alt_setting( struct usb_device *d, int ifnum ) { int alts, alt=0; - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct usb_endpoint_descriptor *ep; int epin, epout; int i; @@ -1531,8 +1531,8 @@ static int get_alt_setting( struct usb_device *d, int ifnum ) epin = -1; epout = -1; - for ( i=0 ; ibNumEndpoints ; i++ ) { - ep = &interface->endpoint[i]; + for ( i=0 ; idesc.bNumEndpoints ; i++ ) { + ep = &interface->endpoint[i].desc; if ( (ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK ) { continue; } @@ -1778,8 +1778,8 @@ static int alloc_usb_midi_device( struct usb_device *d, struct usb_midi_state *s static int detect_yamaha_device( struct usb_device *d, unsigned int ifnum, struct usb_midi_state *s) { - struct usb_config_descriptor *c = d->actconfig; - struct usb_interface_descriptor *interface; + struct usb_host_config *c = d->actconfig; + struct usb_host_interface *interface; struct usb_midi_device *u; unsigned char buf[USB_DT_CONFIG_SIZE], *buffer; int bufSize; @@ -1794,8 +1794,8 @@ static int detect_yamaha_device( struct usb_device *d, unsigned int ifnum, struc for ( i=0 ; i < c->interface[ifnum].num_altsetting; i++ ) { interface = c->interface[ifnum].altsetting + i; - if ( interface->bInterfaceClass != 255 || - interface->bInterfaceSubClass != 0 ) + if ( interface->desc.bInterfaceClass != 255 || + interface->desc.bInterfaceSubClass != 0 ) continue; alts = i; } @@ -1817,7 +1817,7 @@ static int detect_yamaha_device( struct usb_device *d, unsigned int ifnum, struc configfound: /* this may not be necessary. */ - if ( usb_set_configuration( d, c->bConfigurationValue ) < 0 ) { + if ( usb_set_configuration( d, c->desc.bConfigurationValue ) < 0 ) { printk(KERN_INFO "usb-midi: Could not set config.\n"); return -EINVAL; } @@ -1892,8 +1892,8 @@ static int detect_vendor_specific_device( struct usb_device *d, unsigned int ifn **/ static int detect_midi_subclass(struct usb_device *d, unsigned int ifnum, struct usb_midi_state *s) { - struct usb_config_descriptor *c = d->actconfig; - struct usb_interface_descriptor *interface; + struct usb_host_config *c = d->actconfig; + struct usb_host_interface *interface; struct usb_midi_device *u; unsigned char buf[USB_DT_CONFIG_SIZE], *buffer; int bufSize; @@ -1904,8 +1904,8 @@ static int detect_midi_subclass(struct usb_device *d, unsigned int ifnum, struct for ( i=0 ; i < c->interface[ifnum].num_altsetting; i++ ) { interface = c->interface[ifnum].altsetting + i; - if ( interface->bInterfaceClass != USB_CLASS_AUDIO || - interface->bInterfaceSubClass != USB_SUBCLASS_MIDISTREAMING ) + if ( interface->desc.bInterfaceClass != USB_CLASS_AUDIO || + interface->desc.bInterfaceSubClass != USB_SUBCLASS_MIDISTREAMING ) continue; alts = i; } @@ -1927,7 +1927,7 @@ static int detect_midi_subclass(struct usb_device *d, unsigned int ifnum, struct configfound: /* this may not be necessary. */ - if ( usb_set_configuration( d, c->bConfigurationValue ) < 0 ) { + if ( usb_set_configuration( d, c->desc.bConfigurationValue ) < 0 ) { printk(KERN_INFO "usb-midi: Could not set config.\n"); return -EINVAL; } @@ -2025,7 +2025,7 @@ static int usb_midi_probe(struct usb_interface *intf, { struct usb_midi_state *s; struct usb_device *dev = interface_to_usbdev(intf); - int ifnum = intf->altsetting->bInterfaceNumber; + int ifnum = intf->altsetting->desc.bInterfaceNumber; s = (struct usb_midi_state *)kmalloc(sizeof(struct usb_midi_state), GFP_KERNEL); if ( !s ) diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index c2103b175260..2fa6283fc107 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -814,7 +814,7 @@ static int usblp_probe(struct usb_interface *intf, usblp->dev = dev; init_MUTEX (&usblp->sem); init_waitqueue_head(&usblp->wait); - usblp->ifnum = intf->altsetting->bInterfaceNumber; + usblp->ifnum = intf->altsetting->desc.bInterfaceNumber; retval = usb_register_dev(&usblp_fops, USBLP_MINOR_BASE, 1, &usblp->minor); if (retval) { @@ -931,7 +931,7 @@ abort: static int usblp_select_alts(struct usblp *usblp) { struct usb_interface *if_alt; - struct usb_interface_descriptor *ifd; + struct usb_host_interface *ifd; struct usb_endpoint_descriptor *epd, *epwrite, *epread; int p, i, e; @@ -944,17 +944,17 @@ static int usblp_select_alts(struct usblp *usblp) for (i = 0; i < if_alt->num_altsetting; i++) { ifd = &if_alt->altsetting[i]; - if (ifd->bInterfaceClass != 7 || ifd->bInterfaceSubClass != 1) + if (ifd->desc.bInterfaceClass != 7 || ifd->desc.bInterfaceSubClass != 1) continue; - if (ifd->bInterfaceProtocol < USBLP_FIRST_PROTOCOL || - ifd->bInterfaceProtocol > USBLP_LAST_PROTOCOL) + if (ifd->desc.bInterfaceProtocol < USBLP_FIRST_PROTOCOL || + ifd->desc.bInterfaceProtocol > USBLP_LAST_PROTOCOL) continue; /* Look for bulk OUT and IN endpoints. */ epwrite = epread = 0; - for (e = 0; e < ifd->bNumEndpoints; e++) { - epd = &ifd->endpoint[e]; + for (e = 0; e < ifd->desc.bNumEndpoints; e++) { + epd = &ifd->endpoint[e].desc; if ((epd->bmAttributes&USB_ENDPOINT_XFERTYPE_MASK)!= USB_ENDPOINT_XFER_BULK) @@ -969,12 +969,12 @@ static int usblp_select_alts(struct usblp *usblp) } /* Ignore buggy hardware without the right endpoints. */ - if (!epwrite || (ifd->bInterfaceProtocol > 1 && !epread)) + if (!epwrite || (ifd->desc.bInterfaceProtocol > 1 && !epread)) continue; /* Turn off reads for 7/1/1 (unidirectional) interfaces * and buggy bidirectional printers. */ - if (ifd->bInterfaceProtocol == 1) { + if (ifd->desc.bInterfaceProtocol == 1) { epread = NULL; } else if (usblp->quirks & USBLP_QUIRK_BIDIR) { info("Disabling reads from problem bidirectional " @@ -982,9 +982,9 @@ static int usblp_select_alts(struct usblp *usblp) epread = NULL; } - usblp->protocol[ifd->bInterfaceProtocol].alt_setting = i; - usblp->protocol[ifd->bInterfaceProtocol].epwrite = epwrite; - usblp->protocol[ifd->bInterfaceProtocol].epread = epread; + usblp->protocol[ifd->desc.bInterfaceProtocol].alt_setting = i; + usblp->protocol[ifd->desc.bInterfaceProtocol].epwrite = epwrite; + usblp->protocol[ifd->desc.bInterfaceProtocol].epread = epread; } /* If our requested protocol is supported, then use it. */ diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 2598edc8d9c1..cdc0c665c63a 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -4,7 +4,16 @@ #include #include -static int usb_parse_endpoint(struct usb_endpoint_descriptor *endpoint, unsigned char *buffer, int size) + +#define USB_MAXALTSETTING 128 /* Hard limit */ +#define USB_MAXENDPOINTS 30 /* Hard limit */ + +/* these maximums are arbitrary */ +#define USB_MAXCONFIG 8 +#define USB_ALTSETTINGALLOC 4 +#define USB_MAXINTERFACES 32 + +static int usb_parse_endpoint(struct usb_host_endpoint *endpoint, unsigned char *buffer, int size) { struct usb_descriptor_header *header; unsigned char *begin; @@ -20,17 +29,17 @@ static int usb_parse_endpoint(struct usb_endpoint_descriptor *endpoint, unsigned } if (header->bDescriptorType != USB_DT_ENDPOINT) { - warn("unexpected descriptor 0x%X, expecting endpoint descriptor, type 0x%X", - endpoint->bDescriptorType, USB_DT_ENDPOINT); + warn("unexpected descriptor 0x%X, expecting endpoint, 0x%X", + header->bDescriptorType, USB_DT_ENDPOINT); return parsed; } if (header->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) - memcpy(endpoint, buffer, USB_DT_ENDPOINT_AUDIO_SIZE); + memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_AUDIO_SIZE); else - memcpy(endpoint, buffer, USB_DT_ENDPOINT_SIZE); + memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_SIZE); - le16_to_cpus(&endpoint->wMaxPacketSize); + le16_to_cpus(&endpoint->desc.wMaxPacketSize); buffer += header->bLength; size -= header->bLength; @@ -93,7 +102,7 @@ static int usb_parse_interface(struct usb_interface *interface, unsigned char *b { int i, len, numskipped, retval, parsed = 0; struct usb_descriptor_header *header; - struct usb_interface_descriptor *ifp; + struct usb_host_interface *ifp; unsigned char *begin; interface->act_altsetting = 0; @@ -108,6 +117,8 @@ static int usb_parse_interface(struct usb_interface *interface, unsigned char *b } while (size > 0) { + struct usb_interface_descriptor *d; + if (interface->num_altsetting >= interface->max_altsetting) { void *ptr; int oldmas; @@ -141,9 +152,9 @@ static int usb_parse_interface(struct usb_interface *interface, unsigned char *b memcpy(ifp, buffer, USB_DT_INTERFACE_SIZE); /* Skip over the interface */ - buffer += ifp->bLength; - parsed += ifp->bLength; - size -= ifp->bLength; + buffer += ifp->desc.bLength; + parsed += ifp->desc.bLength; + size -= ifp->desc.bLength; begin = buffer; numskipped = 0; @@ -196,23 +207,23 @@ static int usb_parse_interface(struct usb_interface *interface, unsigned char *b (header->bDescriptorType == USB_DT_DEVICE))) return parsed; - if (ifp->bNumEndpoints > USB_MAXENDPOINTS) { + if (ifp->desc.bNumEndpoints > USB_MAXENDPOINTS) { warn("too many endpoints"); return -1; } - ifp->endpoint = (struct usb_endpoint_descriptor *) - kmalloc(ifp->bNumEndpoints * - sizeof(struct usb_endpoint_descriptor), GFP_KERNEL); + ifp->endpoint = (struct usb_host_endpoint *) + kmalloc(ifp->desc.bNumEndpoints * + sizeof(struct usb_host_endpoint), GFP_KERNEL); if (!ifp->endpoint) { err("out of memory"); return -1; } - memset(ifp->endpoint, 0, ifp->bNumEndpoints * - sizeof(struct usb_endpoint_descriptor)); + memset(ifp->endpoint, 0, ifp->desc.bNumEndpoints * + sizeof(struct usb_host_endpoint)); - for (i = 0; i < ifp->bNumEndpoints; i++) { + for (i = 0; i < ifp->desc.bNumEndpoints; i++) { header = (struct usb_descriptor_header *)buffer; if (header->bLength > size) { @@ -230,49 +241,49 @@ static int usb_parse_interface(struct usb_interface *interface, unsigned char *b } /* We check to see if it's an alternate to this one */ - ifp = (struct usb_interface_descriptor *)buffer; - if (size < USB_DT_INTERFACE_SIZE || - ifp->bDescriptorType != USB_DT_INTERFACE || - !ifp->bAlternateSetting) + d = (struct usb_interface_descriptor *)buffer; + if (size < USB_DT_INTERFACE_SIZE + || d->bDescriptorType != USB_DT_INTERFACE + || !d->bAlternateSetting) return parsed; } return parsed; } -int usb_parse_configuration(struct usb_config_descriptor *config, char *buffer) +int usb_parse_configuration(struct usb_host_config *config, char *buffer) { int i, retval, size; struct usb_descriptor_header *header; - memcpy(config, buffer, USB_DT_CONFIG_SIZE); - le16_to_cpus(&config->wTotalLength); - size = config->wTotalLength; + memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE); + le16_to_cpus(&config->desc.wTotalLength); + size = config->desc.wTotalLength; - if (config->bNumInterfaces > USB_MAXINTERFACES) { + if (config->desc.bNumInterfaces > USB_MAXINTERFACES) { warn("too many interfaces"); return -1; } config->interface = (struct usb_interface *) - kmalloc(config->bNumInterfaces * + kmalloc(config->desc.bNumInterfaces * sizeof(struct usb_interface), GFP_KERNEL); - dbg("kmalloc IF %p, numif %i", config->interface, config->bNumInterfaces); + dbg("kmalloc IF %p, numif %i", config->interface, config->desc.bNumInterfaces); if (!config->interface) { err("out of memory"); return -1; } memset(config->interface, 0, - config->bNumInterfaces * sizeof(struct usb_interface)); + config->desc.bNumInterfaces * sizeof(struct usb_interface)); - buffer += config->bLength; - size -= config->bLength; + buffer += config->desc.bLength; + size -= config->desc.bLength; config->extra = NULL; config->extralen = 0; - for (i = 0; i < config->bNumInterfaces; i++) { + for (i = 0; i < config->desc.bNumInterfaces; i++) { int numskipped, len; char *begin; @@ -351,12 +362,12 @@ void usb_destroy_configuration(struct usb_device *dev) } for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { - struct usb_config_descriptor *cf = &dev->config[c]; + struct usb_host_config *cf = &dev->config[c]; if (!cf->interface) break; - for (i = 0; i < cf->bNumInterfaces; i++) { + for (i = 0; i < cf->desc.bNumInterfaces; i++) { struct usb_interface *ifp = &cf->interface[i]; @@ -364,7 +375,7 @@ void usb_destroy_configuration(struct usb_device *dev) break; for (j = 0; j < ifp->num_altsetting; j++) { - struct usb_interface_descriptor *as = + struct usb_host_interface *as = &ifp->altsetting[j]; if(as->extra) { @@ -374,7 +385,7 @@ void usb_destroy_configuration(struct usb_device *dev) if (!as->endpoint) break; - for(k = 0; k < as->bNumEndpoints; k++) { + for(k = 0; k < as->desc.bNumEndpoints; k++) { if(as->endpoint[k].extra) { kfree(as->endpoint[k].extra); } @@ -410,15 +421,15 @@ int usb_get_configuration(struct usb_device *dev) return -EINVAL; } - dev->config = (struct usb_config_descriptor *) + dev->config = (struct usb_host_config *) kmalloc(dev->descriptor.bNumConfigurations * - sizeof(struct usb_config_descriptor), GFP_KERNEL); + sizeof(struct usb_host_config), GFP_KERNEL); if (!dev->config) { err("out of memory"); return -ENOMEM; } memset(dev->config, 0, dev->descriptor.bNumConfigurations * - sizeof(struct usb_config_descriptor)); + sizeof(struct usb_host_config)); dev->rawdescriptors = (char **)kmalloc(sizeof(char *) * dev->descriptor.bNumConfigurations, GFP_KERNEL); diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 1e819db95786..3d4c29b579b4 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c @@ -234,7 +234,7 @@ static char *usb_dump_endpoint_descriptor ( static char *usb_dump_interface_descriptor(char *start, char *end, const struct usb_interface *iface, int setno) { - struct usb_interface_descriptor *desc = &iface->altsetting[setno]; + struct usb_interface_descriptor *desc = &iface->altsetting[setno].desc; if (start > end) return start; @@ -259,15 +259,15 @@ static char *usb_dump_interface( const struct usb_interface *iface, int setno ) { - struct usb_interface_descriptor *desc = &iface->altsetting[setno]; + struct usb_host_interface *desc = &iface->altsetting[setno]; int i; start = usb_dump_interface_descriptor(start, end, iface, setno); - for (i = 0; i < desc->bNumEndpoints; i++) { + for (i = 0; i < desc->desc.bNumEndpoints; i++) { if (start > end) return start; start = usb_dump_endpoint_descriptor(speed, - start, end, desc->endpoint + i); + start, end, &desc->endpoint[i].desc); } return start; } @@ -288,7 +288,7 @@ static char *usb_dump_config_descriptor(char *start, char *end, const struct usb desc->bNumInterfaces, desc->bConfigurationValue, desc->bmAttributes, - desc->MaxPower * 2); + desc->bMaxPower * 2); return start; } @@ -296,7 +296,7 @@ static char *usb_dump_config ( int speed, char *start, char *end, - const struct usb_config_descriptor *config, + const struct usb_host_config *config, int active ) { @@ -307,8 +307,8 @@ static char *usb_dump_config ( return start; if (!config) /* getting these some in 2.3.7; none in 2.3.6 */ return start + sprintf(start, "(null Cfg. desc.)\n"); - start = usb_dump_config_descriptor(start, end, config, active); - for (i = 0; i < config->bNumInterfaces; i++) { + start = usb_dump_config_descriptor(start, end, &config->desc, active); + for (i = 0; i < config->desc.bNumInterfaces; i++) { interface = config->interface + i; if (!interface) break; diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 0c1bc5b47ea1..3770a6a0d270 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -337,7 +337,8 @@ static int claimintf(struct dev_state *ps, unsigned int intf) struct usb_interface *iface; int err; - if (intf >= 8*sizeof(ps->ifclaimed) || !dev || intf >= dev->actconfig->bNumInterfaces) + if (intf >= 8*sizeof(ps->ifclaimed) || !dev + || intf >= dev->actconfig->desc.bNumInterfaces) return -EINVAL; /* already claimed */ if (test_bit(intf, &ps->ifclaimed)) @@ -390,17 +391,17 @@ static int findintfep(struct usb_device *dev, unsigned int ep) { unsigned int i, j, e; struct usb_interface *iface; - struct usb_interface_descriptor *alts; + struct usb_host_interface *alts; struct usb_endpoint_descriptor *endpt; if (ep & ~(USB_DIR_IN|0xf)) return -EINVAL; - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) { + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { iface = &dev->actconfig->interface[i]; for (j = 0; j < iface->num_altsetting; j++) { alts = &iface->altsetting[j]; - for (e = 0; e < alts->bNumEndpoints; e++) { - endpt = &alts->endpoint[e]; + for (e = 0; e < alts->desc.bNumEndpoints; e++) { + endpt = &alts->endpoint[e].desc; if (endpt->bEndpointAddress == ep) return i; } @@ -413,15 +414,15 @@ static int findintfif(struct usb_device *dev, unsigned int ifn) { unsigned int i, j; struct usb_interface *iface; - struct usb_interface_descriptor *alts; + struct usb_host_interface *alts; if (ifn & ~0xff) return -EINVAL; - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) { + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { iface = &dev->actconfig->interface[i]; for (j = 0; j < iface->num_altsetting; j++) { alts = &iface->altsetting[j]; - if (alts->bInterfaceNumber == ifn) + if (alts->desc.bInterfaceNumber == ifn) return i; } } @@ -693,7 +694,7 @@ static int proc_resetdevice(struct dev_state *ps) if (ret < 0) return ret; - for (i = 0; i < ps->dev->actconfig->bNumInterfaces; i++) { + for (i = 0; i < ps->dev->actconfig->desc.bNumInterfaces; i++) { struct usb_interface *intf = &ps->dev->actconfig->interface[i]; /* Don't simulate interfaces we've claimed */ diff --git a/drivers/usb/core/driverfs.c b/drivers/usb/core/driverfs.c index 14b049f547fd..f0b821df7eea 100644 --- a/drivers/usb/core/driverfs.c +++ b/drivers/usb/core/driverfs.c @@ -33,14 +33,14 @@ show_##field (struct device *dev, char *buf, size_t count, loff_t off) \ return 0; \ \ udev = to_usb_device (dev); \ - return sprintf (buf, format_string, udev->actconfig->field); \ + return sprintf (buf, format_string, udev->actconfig->desc.field); \ } \ static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); usb_actconfig_attr (bNumInterfaces, "%2d\n") usb_actconfig_attr (bConfigurationValue, "%2d\n") usb_actconfig_attr (bmAttributes, "%2x\n") -usb_actconfig_attr (MaxPower, "%3dmA\n") +usb_actconfig_attr (bMaxPower, "%3dmA\n") /* String fields */ static ssize_t show_product (struct device *dev, char *buf, size_t count, loff_t off) @@ -157,7 +157,7 @@ void usb_create_driverfs_dev_files (struct usb_device *udev) device_create_file (dev, &dev_attr_bNumInterfaces); device_create_file (dev, &dev_attr_bConfigurationValue); device_create_file (dev, &dev_attr_bmAttributes); - device_create_file (dev, &dev_attr_MaxPower); + device_create_file (dev, &dev_attr_bMaxPower); device_create_file (dev, &dev_attr_idVendor); device_create_file (dev, &dev_attr_idProduct); device_create_file (dev, &dev_attr_bcdDevice); @@ -188,7 +188,7 @@ show_##field (struct device *dev, char *buf, size_t count, loff_t off) \ intf = to_usb_interface (dev); \ alt = intf->act_altsetting; \ \ - return sprintf (buf, format_string, intf->altsetting[alt].field); \ + return sprintf (buf, format_string, intf->altsetting[alt].desc.field); \ } \ static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 4aad0b4a6a09..cf4e9236724c 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -478,7 +478,7 @@ static void hub_disconnect(struct usb_interface *intf) static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) { - struct usb_interface_descriptor *desc; + struct usb_host_interface *desc; struct usb_endpoint_descriptor *endpoint; struct usb_device *dev; struct usb_hub *hub; @@ -489,21 +489,21 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) /* Some hubs have a subclass of 1, which AFAICT according to the */ /* specs is not defined, but it works */ - if ((desc->bInterfaceSubClass != 0) && - (desc->bInterfaceSubClass != 1)) { + if ((desc->desc.bInterfaceSubClass != 0) && + (desc->desc.bInterfaceSubClass != 1)) { err("invalid subclass (%d) for USB hub device #%d", - desc->bInterfaceSubClass, dev->devnum); + desc->desc.bInterfaceSubClass, dev->devnum); return -EIO; } /* Multiple endpoints? What kind of mutant ninja-hub is this? */ - if (desc->bNumEndpoints != 1) { + if (desc->desc.bNumEndpoints != 1) { err("invalid bNumEndpoints (%d) for USB hub device #%d", - desc->bNumEndpoints, dev->devnum); + desc->desc.bNumEndpoints, dev->devnum); return -EIO; } - endpoint = &desc->endpoint[0]; + endpoint = &desc->endpoint[0].desc; /* Output endpoint? Curiousier and curiousier.. */ if (!(endpoint->bEndpointAddress & USB_DIR_IN)) { @@ -1244,18 +1244,18 @@ int usb_reset_device(struct usb_device *dev) return 1; } - ret = usb_set_configuration(dev, dev->actconfig->bConfigurationValue); + ret = usb_set_configuration(dev, dev->actconfig->desc.bConfigurationValue); if (ret < 0) { err("failed to set dev %s active configuration (error=%d)", dev->devpath, ret); return ret; } - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) { + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { struct usb_interface *intf = &dev->actconfig->interface[i]; struct usb_interface_descriptor *as; - as = &intf->altsetting[intf->act_altsetting]; + as = &intf->altsetting[intf->act_altsetting].desc; ret = usb_set_interface(dev, as->bInterfaceNumber, as->bAlternateSetting); if (ret < 0) { diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index cf5967746f7d..18a0c6493483 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -640,31 +640,33 @@ int usb_get_status(struct usb_device *dev, int type, int target, void *data) // hub-only!! ... and only exported for reset/reinit path. -// otherwise used internally, for config/altsetting reconfig. +// otherwise used internally, when setting up a config void usb_set_maxpacket(struct usb_device *dev) { int i, b; - for (i=0; iactconfig->bNumInterfaces; i++) { + for (i=0; iactconfig->desc.bNumInterfaces; i++) { struct usb_interface *ifp = dev->actconfig->interface + i; - struct usb_interface_descriptor *as = ifp->altsetting + ifp->act_altsetting; - struct usb_endpoint_descriptor *ep = as->endpoint; + struct usb_host_interface *as = ifp->altsetting + ifp->act_altsetting; + struct usb_host_endpoint *ep = as->endpoint; int e; - for (e=0; ebNumEndpoints; e++) { - b = ep[e].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; - if ((ep[e].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == + for (e=0; edesc.bNumEndpoints; e++) { + struct usb_endpoint_descriptor *d; + d = &ep [e].desc; + b = d->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; + if ((d->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_CONTROL) { /* Control => bidirectional */ - dev->epmaxpacketout[b] = ep[e].wMaxPacketSize; - dev->epmaxpacketin [b] = ep[e].wMaxPacketSize; + dev->epmaxpacketout[b] = d->wMaxPacketSize; + dev->epmaxpacketin [b] = d->wMaxPacketSize; } - else if (usb_endpoint_out(ep[e].bEndpointAddress)) { - if (ep[e].wMaxPacketSize > dev->epmaxpacketout[b]) - dev->epmaxpacketout[b] = ep[e].wMaxPacketSize; + else if (usb_endpoint_out(d->bEndpointAddress)) { + if (d->wMaxPacketSize > dev->epmaxpacketout[b]) + dev->epmaxpacketout[b] = d->wMaxPacketSize; } else { - if (ep[e].wMaxPacketSize > dev->epmaxpacketin [b]) - dev->epmaxpacketin [b] = ep[e].wMaxPacketSize; + if (d->wMaxPacketSize > dev->epmaxpacketin [b]) + dev->epmaxpacketin [b] = d->wMaxPacketSize; } } } @@ -764,7 +766,7 @@ int usb_clear_halt(struct usb_device *dev, int pipe) int usb_set_interface(struct usb_device *dev, int interface, int alternate) { struct usb_interface *iface; - struct usb_interface_descriptor *iface_as; + struct usb_host_interface *iface_as; int i, ret; iface = usb_ifnum_to_if(dev, interface); @@ -786,7 +788,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE, - iface->altsetting[alternate].bAlternateSetting, + iface->altsetting[alternate] + .desc.bAlternateSetting, interface, NULL, 0, HZ * 5)) < 0) return ret; @@ -798,8 +801,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) /* prevent submissions using previous endpoint settings */ iface_as = iface->altsetting + iface->act_altsetting; - for (i = 0; i < iface_as->bNumEndpoints; i++) { - u8 ep = iface_as->endpoint [i].bEndpointAddress; + for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { + u8 ep = iface_as->endpoint [i].desc.bEndpointAddress; int out = !(ep & USB_DIR_IN); ep &= USB_ENDPOINT_NUMBER_MASK; @@ -821,14 +824,14 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) */ iface_as = &iface->altsetting[alternate]; - for (i = 0; i < iface_as->bNumEndpoints; i++) { - u8 ep = iface_as->endpoint[i].bEndpointAddress; + for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { + u8 ep = iface_as->endpoint[i].desc.bEndpointAddress; int out = !(ep & USB_DIR_IN); ep &= USB_ENDPOINT_NUMBER_MASK; usb_settoggle (dev, ep, out, 0); (out ? dev->epmaxpacketout : dev->epmaxpacketin) [ep] - = iface_as->endpoint [i].wMaxPacketSize; + = iface_as->endpoint [i].desc.wMaxPacketSize; } return 0; @@ -867,10 +870,10 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) int usb_set_configuration(struct usb_device *dev, int configuration) { int i, ret; - struct usb_config_descriptor *cp = NULL; + struct usb_host_config *cp = NULL; for (i=0; idescriptor.bNumConfigurations; i++) { - if (dev->config[i].bConfigurationValue == configuration) { + if (dev->config[i].desc.bConfigurationValue == configuration) { cp = &dev->config[i]; break; } diff --git a/drivers/usb/core/usb-debug.c b/drivers/usb/core/usb-debug.c index a29393e06dcb..c3e29a37665e 100644 --- a/drivers/usb/core/usb-debug.c +++ b/drivers/usb/core/usb-debug.c @@ -16,28 +16,28 @@ #endif #include -static void usb_show_endpoint(struct usb_endpoint_descriptor *endpoint) +static void usb_show_endpoint(struct usb_host_endpoint *endpoint) { - usb_show_endpoint_descriptor(endpoint); + usb_show_endpoint_descriptor(&endpoint->desc); } -static void usb_show_interface(struct usb_interface_descriptor *altsetting) +static void usb_show_interface(struct usb_host_interface *altsetting) { int i; - usb_show_interface_descriptor(altsetting); + usb_show_interface_descriptor(&altsetting->desc); - for (i = 0; i < altsetting->bNumEndpoints; i++) + for (i = 0; i < altsetting->desc.bNumEndpoints; i++) usb_show_endpoint(altsetting->endpoint + i); } -static void usb_show_config(struct usb_config_descriptor *config) +static void usb_show_config(struct usb_host_config *config) { int i, j; struct usb_interface *ifp; - usb_show_config_descriptor(config); - for (i = 0; i < config->bNumInterfaces; i++) { + usb_show_config_descriptor(&config->desc); + for (i = 0; i < config->desc.bNumInterfaces; i++) { ifp = config->interface + i; if (!ifp) @@ -124,7 +124,7 @@ void usb_show_config_descriptor(struct usb_config_descriptor *desc) printk(" bConfigurationValue = %02x\n", desc->bConfigurationValue); printk(" iConfiguration = %02x\n", desc->iConfiguration); printk(" bmAttributes = %02x\n", desc->bmAttributes); - printk(" MaxPower = %4dmA\n", desc->MaxPower * 2); + printk(" bMaxPower = %4dmA\n", desc->bMaxPower * 2); } void usb_show_interface_descriptor(struct usb_interface_descriptor *desc) diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index b217ba001e45..eb00740a20de 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -233,8 +233,9 @@ struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) { int i; - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) - if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum) + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) + if (dev->actconfig->interface[i].altsetting[0] + .desc.bInterfaceNumber == ifnum) return &dev->actconfig->interface[i]; return NULL; @@ -254,15 +255,21 @@ struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) * the first endpoint in that descriptor corresponds to interface zero. * This routine helps device drivers avoid such mistakes. */ -struct usb_endpoint_descriptor *usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum) +struct usb_endpoint_descriptor * +usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum) { int i, j, k; - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) for (j = 0; j < dev->actconfig->interface[i].num_altsetting; j++) - for (k = 0; k < dev->actconfig->interface[i].altsetting[j].bNumEndpoints; k++) - if (epnum == dev->actconfig->interface[i].altsetting[j].endpoint[k].bEndpointAddress) - return &dev->actconfig->interface[i].altsetting[j].endpoint[k]; + for (k = 0; k < dev->actconfig->interface[i] + .altsetting[j].desc.bNumEndpoints; k++) + if (epnum == dev->actconfig->interface[i] + .altsetting[j].endpoint[k] + .desc.bEndpointAddress) + return &dev->actconfig->interface[i] + .altsetting[j].endpoint[k] + .desc; return NULL; } @@ -408,7 +415,7 @@ void usb_driver_release_interface(struct usb_driver *driver, struct usb_interfac const struct usb_device_id * usb_match_id(struct usb_interface *interface, const struct usb_device_id *id) { - struct usb_interface_descriptor *intf; + struct usb_host_interface *intf; struct usb_device *dev; /* proc_connectinfo in devio.c may call us with id == NULL. */ @@ -457,15 +464,15 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id) continue; if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && - (id->bInterfaceClass != intf->bInterfaceClass)) + (id->bInterfaceClass != intf->desc.bInterfaceClass)) continue; if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && - (id->bInterfaceSubClass != intf->bInterfaceSubClass)) + (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass)) continue; if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && - (id->bInterfaceProtocol != intf->bInterfaceProtocol)) + (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol)) continue; return id; @@ -604,10 +611,10 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp, */ envp [i++] = scratch; length += snprintf (scratch, buffer_size - length, - "INTERFACE=%d/%d/%d", - intf->altsetting[alt].bInterfaceClass, - intf->altsetting[alt].bInterfaceSubClass, - intf->altsetting[alt].bInterfaceProtocol); + "INTERFACE=%d/%d/%d", + intf->altsetting[alt].desc.bInterfaceClass, + intf->altsetting[alt].desc.bInterfaceSubClass, + intf->altsetting[alt].desc.bInterfaceProtocol); if ((buffer_size - length <= 0) || (i >= num_envp)) return -ENOMEM; ++length; @@ -792,7 +799,7 @@ void usb_disconnect(struct usb_device **pdev) dbg ("unregistering interfaces on device %d", dev->devnum); if (dev->actconfig) { - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) { + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { struct usb_interface *interface = &dev->actconfig->interface[i]; /* remove this interface */ @@ -1026,7 +1033,7 @@ int usb_new_device(struct usb_device *dev, struct device *parent) } /* we set the default configuration here */ - err = usb_set_configuration(dev, dev->config[0].bConfigurationValue); + err = usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue); if (err) { err("failed to set device %d default configuration (error=%d)", dev->devnum, err); @@ -1065,16 +1072,17 @@ int usb_new_device(struct usb_device *dev, struct device *parent) /* Register all of the interfaces for this device with the driver core. * Remember, interfaces get bound to drivers, not devices. */ - for (i = 0; i < dev->actconfig->bNumInterfaces; i++) { + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { struct usb_interface *interface = &dev->actconfig->interface[i]; - struct usb_interface_descriptor *desc = interface->altsetting; + struct usb_interface_descriptor *desc; + desc = &interface->altsetting [interface->act_altsetting].desc; interface->dev.parent = &dev->dev; interface->dev.driver = NULL; interface->dev.bus = &usb_bus_type; sprintf (&interface->dev.bus_id[0], "%d-%s:%d", dev->bus->busnum, dev->devpath, - interface->altsetting->bInterfaceNumber); + desc->bInterfaceNumber); if (!desc->iInterface || usb_string (dev, desc->iInterface, interface->dev.name, @@ -1087,7 +1095,7 @@ int usb_new_device(struct usb_device *dev, struct device *parent) sprintf (&interface->dev.name[0], "usb-%s-%s interface %d", dev->bus->bus_name, dev->devpath, - interface->altsetting->bInterfaceNumber); + desc->bInterfaceNumber); } dbg ("%s - registering %s", __FUNCTION__, interface->dev.bus_id); device_register (&interface->dev); diff --git a/drivers/usb/image/hpusbscsi.c b/drivers/usb/image/hpusbscsi.c index 0f20f949274a..00bb26a79802 100644 --- a/drivers/usb/image/hpusbscsi.c +++ b/drivers/usb/image/hpusbscsi.c @@ -35,14 +35,14 @@ hpusbscsi_usb_probe (struct usb_interface *intf, { struct hpusbscsi *new; struct usb_device *dev = interface_to_usbdev (intf); - struct usb_interface_descriptor *altsetting = + struct usb_host_interface *altsetting = &(intf->altsetting[0]); int i, result; /* basic check */ - if (altsetting->bNumEndpoints != 3) { + if (altsetting->desc.bNumEndpoints != 3) { printk (KERN_ERR "Wrong number of endpoints\n"); return -ENODEV; } @@ -76,34 +76,34 @@ hpusbscsi_usb_probe (struct usb_interface *intf, /* finding endpoints */ - for (i = 0; i < altsetting->bNumEndpoints; i++) { + for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { if ( - (altsetting->endpoint[i]. + (altsetting->endpoint[i].desc. bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) { - if (altsetting->endpoint[i]. + if (altsetting->endpoint[i].desc. bEndpointAddress & USB_DIR_IN) { new->ep_in = - altsetting->endpoint[i]. + altsetting->endpoint[i].desc. bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; } else { new->ep_out = - altsetting->endpoint[i]. + altsetting->endpoint[i].desc. bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; } } else { new->ep_int = - altsetting->endpoint[i]. + altsetting->endpoint[i].desc. bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; - new->interrupt_interval= altsetting->endpoint[i].bInterval; + new->interrupt_interval= altsetting->endpoint[i].desc.bInterval; } } /* USB initialisation magic for the simple case */ - result = usb_set_interface (dev, altsetting->bInterfaceNumber, 0); + result = usb_set_interface (dev, altsetting->desc.bInterfaceNumber, 0); switch (result) { case 0: /* no error */ diff --git a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c index f88094fb95fa..571c72615cab 100644 --- a/drivers/usb/image/mdc800.c +++ b/drivers/usb/image/mdc800.c @@ -410,7 +410,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, const struct usb_device_id *id) { int i,j; - struct usb_interface_descriptor *intf_desc; + struct usb_host_interface *intf_desc; struct usb_device *dev = interface_to_usbdev (intf); int irq_interval=0; int retval; @@ -432,10 +432,10 @@ static int mdc800_usb_probe (struct usb_interface *intf, intf_desc = &intf->altsetting[0]; if ( - ( intf_desc->bInterfaceClass != 0xff ) - || ( intf_desc->bInterfaceSubClass != 0 ) - || ( intf_desc->bInterfaceProtocol != 0 ) - || ( intf_desc->bNumEndpoints != 4) + ( intf_desc->desc.bInterfaceClass != 0xff ) + || ( intf_desc->desc.bInterfaceSubClass != 0 ) + || ( intf_desc->desc.bInterfaceProtocol != 0 ) + || ( intf_desc->desc.bNumEndpoints != 4) ) { err ("probe fails -> wrong Interface"); @@ -448,12 +448,12 @@ static int mdc800_usb_probe (struct usb_interface *intf, mdc800->endpoint[i]=-1; for (j=0; j<4; j++) { - if (mdc800_endpoint_equals (&intf_desc->endpoint [j],&mdc800_ed [i])) + if (mdc800_endpoint_equals (&intf_desc->endpoint [j].desc,&mdc800_ed [i])) { - mdc800->endpoint[i]=intf_desc->endpoint [j].bEndpointAddress ; + mdc800->endpoint[i]=intf_desc->endpoint [j].desc.bEndpointAddress ; if (i==1) { - irq_interval=intf_desc->endpoint [j].bInterval; + irq_interval=intf_desc->endpoint [j].desc.bInterval; } continue; @@ -468,7 +468,7 @@ static int mdc800_usb_probe (struct usb_interface *intf, usb_driver_claim_interface (&mdc800_usb_driver, intf, mdc800); - if (usb_set_interface (dev, intf_desc->bInterfaceNumber, 0) < 0) + if (usb_set_interface (dev, intf_desc->desc.bInterfaceNumber, 0) < 0) { err ("MDC800 Configuration fails."); return -ENODEV; diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index a9a21048930a..9017e760fc53 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c @@ -851,7 +851,7 @@ static int mts_usb_probe (struct usb_interface *intf, struct usb_device *dev = interface_to_usbdev (intf); /* the altsettting 0 on the interface we're probing */ - struct usb_interface_descriptor *altsetting; + struct usb_host_interface *altsetting; MTS_DEBUG_GOT_HERE(); MTS_DEBUG( "usb-device descriptor at %x\n", (int)dev ); @@ -877,23 +877,23 @@ static int mts_usb_probe (struct usb_interface *intf, /* Check if the config is sane */ - if ( altsetting->bNumEndpoints != MTS_EP_TOTAL ) { + if ( altsetting->desc.bNumEndpoints != MTS_EP_TOTAL ) { MTS_WARNING( "expecting %d got %d endpoints! Bailing out.\n", - (int)MTS_EP_TOTAL, (int)altsetting->bNumEndpoints ); + (int)MTS_EP_TOTAL, (int)altsetting->desc.bNumEndpoints ); return -ENODEV; } - for( i = 0; i < altsetting->bNumEndpoints; i++ ) { - if ((altsetting->endpoint[i].bmAttributes & + for( i = 0; i < altsetting->desc.bNumEndpoints; i++ ) { + if ((altsetting->endpoint[i].desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK) { MTS_WARNING( "can only deal with bulk endpoints; endpoint %d is not bulk.\n", - (int)altsetting->endpoint[i].bEndpointAddress ); + (int)altsetting->endpoint[i].desc.bEndpointAddress ); } else { - if (altsetting->endpoint[i].bEndpointAddress & + if (altsetting->endpoint[i].desc.bEndpointAddress & USB_DIR_IN) *ep_in_current++ - = altsetting->endpoint[i].bEndpointAddress & + = altsetting->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; else { if ( ep_out != -1 ) { @@ -901,7 +901,7 @@ static int mts_usb_probe (struct usb_interface *intf, return -ENODEV; } - ep_out = altsetting->endpoint[i].bEndpointAddress & + ep_out = altsetting->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; } } diff --git a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c index e86daf15fb4f..bc7affeedff6 100644 --- a/drivers/usb/image/scanner.c +++ b/drivers/usb/image/scanner.c @@ -839,7 +839,7 @@ probe_scanner(struct usb_interface *intf, { struct usb_device *dev = interface_to_usbdev (intf); struct scn_usb_data *scn; - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; int ep_cnt; @@ -905,13 +905,13 @@ probe_scanner(struct usb_interface *intf, return -ENODEV; } - if (dev->config[0].bNumInterfaces != 1) { + if (dev->config[0].desc.bNumInterfaces != 1) { info("probe_scanner: Only one device interface is supported."); return -ENODEV; } interface = intf->altsetting; - endpoint = interface->endpoint; + endpoint = &interface->endpoint[0].desc; /* * Start checking for two bulk endpoints OR two bulk endpoints *and* one @@ -919,16 +919,16 @@ probe_scanner(struct usb_interface *intf, * setup the handler. FIXME: This is a future enhancement... */ - dbg("probe_scanner: Number of Endpoints:%d", (int) interface->bNumEndpoints); + dbg("probe_scanner: Number of Endpoints:%d", (int) interface->desc.bNumEndpoints); - if ((interface->bNumEndpoints != 2) && (interface->bNumEndpoints != 3)) { + if ((interface->desc.bNumEndpoints != 2) && (interface->desc.bNumEndpoints != 3)) { info("probe_scanner: Only two or three endpoints supported."); return -ENODEV; } ep_cnt = have_bulk_in = have_bulk_out = have_intr = 0; - while (ep_cnt < interface->bNumEndpoints) { + while (ep_cnt < interface->desc.bNumEndpoints) { if (!have_bulk_in && IS_EP_BULK_IN(endpoint[ep_cnt])) { ep_cnt++; @@ -960,7 +960,7 @@ probe_scanner(struct usb_interface *intf, * should have. */ - switch(interface->bNumEndpoints) { + switch(interface->desc.bNumEndpoints) { case 2: if (!have_bulk_in || !have_bulk_out) { info("probe_scanner: Two bulk endpoints required."); diff --git a/drivers/usb/input/aiptek.c b/drivers/usb/input/aiptek.c index e558134bae9d..fe5ccf692f2b 100644 --- a/drivers/usb/input/aiptek.c +++ b/drivers/usb/input/aiptek.c @@ -313,7 +313,7 @@ aiptek_probe(struct usb_interface *intf, aiptek->dev.id.version = dev->descriptor.bcdDevice; aiptek->usbdev = dev; - endpoint = intf->altsetting[0].endpoint + 0; + endpoint = &intf->altsetting[0].endpoint[0].desc; if (aiptek->features->pktlen > 10) BUG(); diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 7331d93da09a..2fa6ce372ab2 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c @@ -1386,7 +1386,7 @@ static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid) static struct hid_device *usb_hid_configure(struct usb_interface *intf) { - struct usb_interface_descriptor *interface = intf->altsetting + intf->act_altsetting; + struct usb_host_interface *interface = intf->altsetting + intf->act_altsetting; struct usb_device *dev = interface_to_usbdev (intf); struct hid_descriptor *hdesc; struct hid_device *hid; @@ -1402,7 +1402,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) if (quirks & HID_QUIRK_IGNORE) return NULL; - if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->bNumEndpoints) || + if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->desc.bNumEndpoints) || usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) { dbg("class descriptor not present\n"); return NULL; @@ -1422,7 +1422,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) return NULL; } - if ((n = hid_get_class_descriptor(dev, interface->bInterfaceNumber, HID_DT_REPORT, rdesc, rsize)) < 0) { + if ((n = hid_get_class_descriptor(dev, interface->desc.bInterfaceNumber, HID_DT_REPORT, rdesc, rsize)) < 0) { dbg("reading report descriptor failed"); kfree(rdesc); return NULL; @@ -1449,11 +1449,12 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) goto fail; } - for (n = 0; n < interface->bNumEndpoints; n++) { + for (n = 0; n < interface->desc.bNumEndpoints; n++) { - struct usb_endpoint_descriptor *endpoint = &interface->endpoint[n]; + struct usb_endpoint_descriptor *endpoint; int pipe; + endpoint = &interface->endpoint[n].desc; if ((endpoint->bmAttributes & 3) != 3) /* Not an interrupt endpoint */ continue; @@ -1493,7 +1494,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) hid->version = le16_to_cpu(hdesc->bcdHID); hid->country = hdesc->bCountryCode; hid->dev = dev; - hid->ifnum = interface->bInterfaceNumber; + hid->ifnum = interface->desc.bInterfaceNumber; hid->name[0] = 0; @@ -1510,7 +1511,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) snprintf(hid->name, 128, "%04x:%04x", dev->descriptor.idVendor, dev->descriptor.idProduct); usb_make_path(dev, buf, 64); - snprintf(hid->phys, 64, "%s/input%d", buf, intf->altsetting[0].bInterfaceNumber); + snprintf(hid->phys, 64, "%s/input%d", buf, + intf->altsetting[0].desc.bInterfaceNumber); if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) hid->uniq[0] = 0; diff --git a/drivers/usb/input/powermate.c b/drivers/usb/input/powermate.c index 47fb5fd3c852..6e0c7557678d 100644 --- a/drivers/usb/input/powermate.c +++ b/drivers/usb/input/powermate.c @@ -290,14 +290,14 @@ static void powermate_free_buffers(struct usb_device *udev, struct powermate_dev static int powermate_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *udev = interface_to_usbdev (intf); - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct powermate_device *pm; int pipe, maxp; char path[64]; interface = intf->altsetting + 0; - endpoint = interface->endpoint + 0; + endpoint = &interface->endpoint[0].desc; if (!(endpoint->bEndpointAddress & 0x80)) return -EIO; if ((endpoint->bmAttributes & 3) != 3) @@ -305,7 +305,7 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x0a, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - 0, interface->bInterfaceNumber, NULL, 0, + 0, interface->desc.bInterfaceNumber, NULL, 0, HZ * USB_CTRL_SET_TIMEOUT); if (!(pm = kmalloc(sizeof(struct powermate_device), GFP_KERNEL))) diff --git a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c index a92742d3fa5e..2b5ebb8c4a3f 100644 --- a/drivers/usb/input/usbkbd.c +++ b/drivers/usb/input/usbkbd.c @@ -228,7 +228,7 @@ static int usb_kbd_probe(struct usb_interface *iface, const struct usb_device_id *id) { struct usb_device * dev = interface_to_usbdev(iface); - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct usb_kbd *kbd; int i, pipe, maxp; @@ -237,10 +237,10 @@ static int usb_kbd_probe(struct usb_interface *iface, interface = &iface->altsetting[iface->act_altsetting]; - if (interface->bNumEndpoints != 1) + if (interface->desc.bNumEndpoints != 1) return -ENODEV; - endpoint = interface->endpoint + 0; + endpoint = &interface->endpoint[0].desc; if (!(endpoint->bEndpointAddress & 0x80)) return -ENODEV; if ((endpoint->bmAttributes & 3) != 3) @@ -282,7 +282,7 @@ static int usb_kbd_probe(struct usb_interface *iface, kbd->cr->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE; kbd->cr->bRequest = 0x09; kbd->cr->wValue = cpu_to_le16(0x200); - kbd->cr->wIndex = cpu_to_le16(interface->bInterfaceNumber); + kbd->cr->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); kbd->cr->wLength = cpu_to_le16(1); usb_make_path(dev, path, 64); diff --git a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c index 5728136ca14d..15a88e2e11e5 100644 --- a/drivers/usb/input/usbmouse.c +++ b/drivers/usb/input/usbmouse.c @@ -121,7 +121,7 @@ static void usb_mouse_close(struct input_dev *dev) static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_id * id) { struct usb_device * dev = interface_to_usbdev(intf); - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct usb_mouse *mouse; int pipe, maxp; @@ -130,10 +130,10 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_ interface = &intf->altsetting[intf->act_altsetting]; - if (interface->bNumEndpoints != 1) + if (interface->desc.bNumEndpoints != 1) return -ENODEV; - endpoint = interface->endpoint + 0; + endpoint = &interface->endpoint[0].desc; if (!(endpoint->bEndpointAddress & 0x80)) return -ENODEV; if ((endpoint->bmAttributes & 3) != 3) diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c index 2f5ef39b4630..5efae4d7b0ab 100644 --- a/drivers/usb/input/wacom.c +++ b/drivers/usb/input/wacom.c @@ -561,7 +561,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i wacom->dev.id.version = dev->descriptor.bcdDevice; wacom->usbdev = dev; - endpoint = intf->altsetting[0].endpoint + 0; + endpoint = &intf->altsetting[0].endpoint[0].desc; if (wacom->features->pktlen > 10) BUG(); diff --git a/drivers/usb/input/xpad.c b/drivers/usb/input/xpad.c index e3eab2783fd9..1f41067695fe 100644 --- a/drivers/usb/input/xpad.c +++ b/drivers/usb/input/xpad.c @@ -249,7 +249,7 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id return -ENOMEM; } - ep_irq_in = intf->altsetting[0].endpoint + 0; + ep_irq_in = &intf->altsetting[0].endpoint[0].desc; usb_fill_int_urb(xpad->irq_in, udev, usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), diff --git a/drivers/usb/media/dabusb.c b/drivers/usb/media/dabusb.c index 1f241ebddf12..ad0c2e2c86a5 100644 --- a/drivers/usb/media/dabusb.c +++ b/drivers/usb/media/dabusb.c @@ -728,7 +728,7 @@ static int dabusb_probe (struct usb_interface *intf, if (usbdev->descriptor.bNumConfigurations != 1) return -ENODEV; - if (intf->altsetting->bInterfaceNumber != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999) + if (intf->altsetting->desc.bInterfaceNumber != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999) return -ENODEV; retval = usb_register_dev (&dabusb_fops, DABUSB_MINOR, 1, &devnum); @@ -742,7 +742,7 @@ static int dabusb_probe (struct usb_interface *intf, s->usbdev = usbdev; s->devnum = devnum; - if (usb_set_configuration (usbdev, usbdev->config[0].bConfigurationValue) < 0) { + if (usb_set_configuration (usbdev, usbdev->config[0].desc.bConfigurationValue) < 0) { err("set_configuration failed"); goto reject; } diff --git a/drivers/usb/media/ibmcam.c b/drivers/usb/media/ibmcam.c index 74b1c5303374..1630ba673fde 100644 --- a/drivers/usb/media/ibmcam.c +++ b/drivers/usb/media/ibmcam.c @@ -3662,7 +3662,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * struct uvd *uvd = NULL; int i, nas, model=0, canvasX=0, canvasY=0; int actInterface=-1, inactInterface=-1, maxPS=0; - __u8 ifnum = intf->altsetting->bInterfaceNumber; + __u8 ifnum = intf->altsetting->desc.bInterfaceNumber; unsigned char video_ep = 0; if (debug >= 1) @@ -3740,16 +3740,16 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * } /* Validate all alternate settings */ for (i=0; i < nas; i++) { - const struct usb_interface_descriptor *interface; + const struct usb_host_interface *interface; const struct usb_endpoint_descriptor *endpoint; interface = &dev->actconfig->interface[ifnum].altsetting[i]; - if (interface->bNumEndpoints != 1) { + if (interface->desc.bNumEndpoints != 1) { err("Interface %d. has %u. endpoints!", - ifnum, (unsigned)(interface->bNumEndpoints)); + ifnum, (unsigned)(interface->desc.bNumEndpoints)); return -ENODEV; } - endpoint = &interface->endpoint[0]; + endpoint = &interface->endpoint[0].desc; if (video_ep == 0) video_ep = endpoint->bEndpointAddress; else if (video_ep != endpoint->bEndpointAddress) { diff --git a/drivers/usb/media/konicawc.c b/drivers/usb/media/konicawc.c index 429be7f94526..190743d30b2f 100644 --- a/drivers/usb/media/konicawc.c +++ b/drivers/usb/media/konicawc.c @@ -381,10 +381,10 @@ static int konicawc_start_data(struct uvd *uvd) int i, errFlag; struct konicawc *cam = (struct konicawc *)uvd->user_data; int pktsz; - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; interface = &dev->actconfig->interface[uvd->iface].altsetting[spd_to_iface[cam->speed]]; - pktsz = interface->endpoint[1].wMaxPacketSize; + pktsz = interface->endpoint[1].desc.wMaxPacketSize; DEBUG(1, "pktsz = %d", pktsz); if (!CAMERA_IS_OPERATIONAL(uvd)) { err("Camera is not operational"); @@ -742,17 +742,17 @@ static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id } /* Validate all alternate settings */ for (i=0; i < nas; i++) { - const struct usb_interface_descriptor *interface; + const struct usb_host_interface *interface; const struct usb_endpoint_descriptor *endpoint; interface = &intf->altsetting[i]; - if (interface->bNumEndpoints != 2) { + if (interface->desc.bNumEndpoints != 2) { err("Interface %d. has %u. endpoints!", - interface->bInterfaceNumber, - (unsigned)(interface->bNumEndpoints)); + interface->desc.bInterfaceNumber, + (unsigned)(interface->desc.bNumEndpoints)); return -ENODEV; } - endpoint = &interface->endpoint[1]; + endpoint = &interface->endpoint[1].desc; DEBUG(1, "found endpoint: addr: 0x%2.2x maxps = 0x%4.4x", endpoint->bEndpointAddress, endpoint->wMaxPacketSize); if (video_ep == 0) @@ -763,12 +763,12 @@ static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id } if ((endpoint->bmAttributes & 0x03) != 0x01) { err("Interface %d. has non-ISO endpoint!", - interface->bInterfaceNumber); + interface->desc.bInterfaceNumber); return -ENODEV; } if ((endpoint->bEndpointAddress & 0x80) == 0) { err("Interface %d. has ISO OUT endpoint!", - interface->bInterfaceNumber); + interface->desc.bInterfaceNumber); return -ENODEV; } if (endpoint->wMaxPacketSize == 0) { @@ -819,7 +819,7 @@ static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id uvd->flags = 0; uvd->debug = debug; uvd->dev = dev; - uvd->iface = intf->altsetting->bInterfaceNumber; + uvd->iface = intf->altsetting->desc.bInterfaceNumber; uvd->ifaceAltInactive = inactInterface; uvd->ifaceAltActive = actInterface; uvd->video_endp = video_ep; diff --git a/drivers/usb/media/ov511.c b/drivers/usb/media/ov511.c index d74828011b6f..0f8f81143f61 100644 --- a/drivers/usb/media/ov511.c +++ b/drivers/usb/media/ov511.c @@ -5988,7 +5988,7 @@ ov518_configure(struct usb_ov511 *ov) if (ov->bridge == BRG_OV518) { struct usb_interface *ifp = &ov->dev->config[0].interface[0]; - __u16 mxps = ifp->altsetting[7].endpoint[0].wMaxPacketSize; + __u16 mxps = ifp->altsetting[7].endpoint[0].desc.wMaxPacketSize; /* Some OV518s have packet numbering by default, some don't */ if (mxps == 897) @@ -6083,7 +6083,7 @@ ov51x_probe(struct usb_interface *intf, if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; - interface = &intf->altsetting[0]; + interface = &intf->altsetting[0].desc; /* Checking vendor/product should be enough, but what the hell */ if (interface->bInterfaceClass != 0xFF) diff --git a/drivers/usb/media/pwc-if.c b/drivers/usb/media/pwc-if.c index d493fe673abe..f630ff649fd4 100644 --- a/drivers/usb/media/pwc-if.c +++ b/drivers/usb/media/pwc-if.c @@ -761,7 +761,7 @@ static int pwc_isoc_init(struct pwc_device *pdev) struct urb *urb; int i, j, ret; - struct usb_interface_descriptor *idesc; + struct usb_host_interface *idesc; int cur_alt; if (pdev == NULL) @@ -781,9 +781,9 @@ static int pwc_isoc_init(struct pwc_device *pdev) /* Search video endpoint */ pdev->vmax_packet_size = -1; - for (i = 0; i < idesc->bNumEndpoints; i++) - if ((idesc->endpoint[i].bEndpointAddress & 0xF) == pdev->vendpoint) { - pdev->vmax_packet_size = idesc->endpoint[i].wMaxPacketSize; + for (i = 0; i < idesc->desc.bNumEndpoints; i++) + if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) { + pdev->vmax_packet_size = idesc->endpoint[i].desc.wMaxPacketSize; break; } @@ -1552,13 +1552,15 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id free_mem_leak(); /* Check if we can handle this device */ - Trace(TRACE_PROBE, "probe() called [%04X %04X], if %d\n", udev->descriptor.idVendor, udev->descriptor.idProduct, intf->altsetting->bInterfaceNumber); + Trace(TRACE_PROBE, "probe() called [%04X %04X], if %d\n", + udev->descriptor.idVendor, udev->descriptor.idProduct, + intf->altsetting->desc.bInterfaceNumber); /* the interfaces are probed one by one. We are only interested in the video interface (0) now. Interface 1 is the Audio Control, and interface 2 Audio itself. */ - if (intf->altsetting->bInterfaceNumber > 0) + if (intf->altsetting->desc.bInterfaceNumber > 0) return -ENODEV; vendor_id = udev->descriptor.idVendor; diff --git a/drivers/usb/media/se401.c b/drivers/usb/media/se401.c index 01390ade20e6..fd090f2fd147 100644 --- a/drivers/usb/media/se401.c +++ b/drivers/usb/media/se401.c @@ -1456,7 +1456,7 @@ static int se401_probe(struct usb_interface *intf, if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; - interface = &intf->altsetting[0]; + interface = &intf->altsetting[0].desc; /* Is it an se401? */ if (dev->descriptor.idVendor == 0x03e8 && diff --git a/drivers/usb/media/ultracam.c b/drivers/usb/media/ultracam.c index 75fe954716be..f0f3a8e9d60a 100644 --- a/drivers/usb/media/ultracam.c +++ b/drivers/usb/media/ultracam.c @@ -569,17 +569,17 @@ static int ultracam_probe(struct usb_interface *intf, const struct usb_device_id } /* Validate all alternate settings */ for (i=0; i < nas; i++) { - const struct usb_interface_descriptor *interface; + const struct usb_host_interface *interface; const struct usb_endpoint_descriptor *endpoint; interface = &intf->altsetting[i]; - if (interface->bNumEndpoints != 1) { + if (interface->desc.bNumEndpoints != 1) { err("Interface %d. has %u. endpoints!", - interface->bInterfaceNumber, - (unsigned)(interface->bNumEndpoints)); + interface->desc.bInterfaceNumber, + (unsigned)(interface->desc.bNumEndpoints)); return -ENODEV; } - endpoint = &interface->endpoint[0]; + endpoint = &interface->endpoint[0].desc; if (video_ep == 0) video_ep = endpoint->bEndpointAddress; else if (video_ep != endpoint->bEndpointAddress) { @@ -588,12 +588,12 @@ static int ultracam_probe(struct usb_interface *intf, const struct usb_device_id } if ((endpoint->bmAttributes & 0x03) != 0x01) { err("Interface %d. has non-ISO endpoint!", - interface->bInterfaceNumber); + interface->desc.bInterfaceNumber); return -ENODEV; } if ((endpoint->bEndpointAddress & 0x80) == 0) { err("Interface %d. has ISO OUT endpoint!", - interface->bInterfaceNumber); + interface->desc.bInterfaceNumber); return -ENODEV; } if (endpoint->wMaxPacketSize == 0) { @@ -636,7 +636,7 @@ static int ultracam_probe(struct usb_interface *intf, const struct usb_device_id uvd->flags = flags; uvd->debug = debug; uvd->dev = dev; - uvd->iface = intf->altsetting->bInterfaceNumber; + uvd->iface = intf->altsetting->desc.bInterfaceNumber; uvd->ifaceAltInactive = inactInterface; uvd->ifaceAltActive = actInterface; uvd->video_endp = video_ep; diff --git a/drivers/usb/media/vicam.c b/drivers/usb/media/vicam.c index fa2ca5098877..178228860c7f 100644 --- a/drivers/usb/media/vicam.c +++ b/drivers/usb/media/vicam.c @@ -1253,7 +1253,7 @@ vicam_probe( struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); int bulkEndpoint = 0; - const struct usb_interface_descriptor *interface; + const struct usb_host_interface *interface; const struct usb_endpoint_descriptor *endpoint; struct vicam_camera *cam; @@ -1268,8 +1268,8 @@ vicam_probe( struct usb_interface *intf, const struct usb_device_id *id) interface = &intf->altsetting[0]; DBG(KERN_DEBUG "Interface %d. has %u. endpoints!\n", - ifnum, (unsigned) (interface->bNumEndpoints)); - endpoint = &interface->endpoint[0]; + ifnum, (unsigned) (interface->desc.bNumEndpoints)); + endpoint = &interface->endpoint[0].desc; if ((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x02)) { diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index a4738366cb59..c245ee3d455c 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c @@ -1943,7 +1943,7 @@ static int auerswald_probe (struct usb_interface *intf, return -ENODEV; /* we use only the first -and only- interface */ - if (intf->altsetting->bInterfaceNumber != 0) + if (intf->altsetting->desc.bInterfaceNumber != 0) return -ENODEV; /* prevent module unloading while sleeping */ diff --git a/drivers/usb/misc/brlvger.c b/drivers/usb/misc/brlvger.c index 89b1e90b2719..db226465bf9c 100644 --- a/drivers/usb/misc/brlvger.c +++ b/drivers/usb/misc/brlvger.c @@ -290,7 +290,7 @@ brlvger_probe (struct usb_interface *intf, int i; int retval; struct usb_endpoint_descriptor *endpoint; - struct usb_interface_descriptor *actifsettings; + struct usb_host_interface *actifsettings; /* protects against reentrance: once we've found a free slot we reserve it.*/ static DECLARE_MUTEX(reserve_sem); @@ -299,13 +299,13 @@ brlvger_probe (struct usb_interface *intf, actifsettings = dev->actconfig->interface->altsetting; if( dev->descriptor.bNumConfigurations != 1 - || dev->config->bNumInterfaces != 1 - || actifsettings->bNumEndpoints != 1 ) { + || dev->config->desc.bNumInterfaces != 1 + || actifsettings->desc.bNumEndpoints != 1 ) { err ("Bogus braille display config info"); return -ENODEV; } - endpoint = actifsettings->endpoint; + endpoint = &actifsettings->endpoint [0].desc; if (!(endpoint->bEndpointAddress & 0x80) || ((endpoint->bmAttributes & 3) != 0x03)) { err ("Bogus braille display config info, wrong endpoints"); diff --git a/drivers/usb/misc/tiglusb.c b/drivers/usb/misc/tiglusb.c index 6dada5ddf6f4..c535d28da923 100644 --- a/drivers/usb/misc/tiglusb.c +++ b/drivers/usb/misc/tiglusb.c @@ -64,7 +64,7 @@ static devfs_handle_t devfs_handle; static inline int clear_device (struct usb_device *dev) { - if (usb_set_configuration (dev, dev->config[0].bConfigurationValue) < 0) { + if (usb_set_configuration (dev, dev->config[0].desc.bConfigurationValue) < 0) { err ("clear_device failed"); return -1; } @@ -351,7 +351,7 @@ tiglusb_probe (struct usb_interface *intf, && (dev->descriptor.idVendor != 0x451)) return -ENODEV; - if (usb_set_configuration (dev, dev->config[0].bConfigurationValue) < 0) { + if (usb_set_configuration (dev, dev->config[0].desc.bConfigurationValue) < 0) { err ("tiglusb_probe: set_configuration failed"); return -ENODEV; } diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 504be379b594..faa2ee6d40bb 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -290,7 +290,7 @@ static int get_altsetting (struct usbtest_dev *dev) retval = usb_control_msg (udev, usb_rcvctrlpipe (udev, 0), USB_REQ_GET_INTERFACE, USB_DIR_IN|USB_RECIP_INTERFACE, - 0, iface->altsetting [0].bInterfaceNumber, + 0, iface->altsetting [0].desc.bInterfaceNumber, dev->buf, 1, HZ * USB_CTRL_GET_TIMEOUT); switch (retval) { case 1: @@ -308,7 +308,7 @@ static int set_altsetting (struct usbtest_dev *dev, int alternate) { struct usb_interface *iface = dev->intf; struct usb_device *udev; - struct usb_interface_descriptor *iface_as; + struct usb_host_interface *iface_as; int i, ret; if (alternate < 0 || alternate >= iface->num_altsetting) @@ -317,8 +317,8 @@ static int set_altsetting (struct usbtest_dev *dev, int alternate) udev = interface_to_usbdev (iface); if ((ret = usb_control_msg (udev, usb_sndctrlpipe (udev, 0), USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE, - iface->altsetting [alternate].bAlternateSetting, - iface->altsetting [alternate].bInterfaceNumber, + alternate, + iface->altsetting->desc.bInterfaceNumber, NULL, 0, HZ * USB_CTRL_SET_TIMEOUT)) < 0) return ret; @@ -328,8 +328,8 @@ static int set_altsetting (struct usbtest_dev *dev, int alternate) /* prevent requests using previous endpoint settings */ iface_as = iface->altsetting + iface->act_altsetting; - for (i = 0; i < iface_as->bNumEndpoints; i++) { - u8 ep = iface_as->endpoint [i].bEndpointAddress; + for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { + u8 ep = iface_as->endpoint [i].desc.bEndpointAddress; int out = !(ep & USB_DIR_IN); ep &= USB_ENDPOINT_NUMBER_MASK; @@ -340,14 +340,14 @@ static int set_altsetting (struct usbtest_dev *dev, int alternate) /* reset toggles and maxpacket for all endpoints affected */ iface_as = iface->altsetting + iface->act_altsetting; - for (i = 0; i < iface_as->bNumEndpoints; i++) { - u8 ep = iface_as->endpoint [i].bEndpointAddress; + for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { + u8 ep = iface_as->endpoint [i].desc.bEndpointAddress; int out = !(ep & USB_DIR_IN); ep &= USB_ENDPOINT_NUMBER_MASK; usb_settoggle (udev, ep, out, 0); (out ? udev->epmaxpacketout : udev->epmaxpacketin ) [ep] - = iface_as->endpoint [i].wMaxPacketSize; + = iface_as->endpoint [i].desc.wMaxPacketSize; } return 0; @@ -415,10 +415,10 @@ static int ch9_postconfig (struct usbtest_dev *dev) /* 9.2.3 constrains the range here, and Linux ensures * they're ordered meaningfully in this array */ - if (iface->altsetting [i].bAlternateSetting != i) { + if (iface->altsetting [i].desc.bAlternateSetting != i) { dbg ("%s, illegal alt [%d].bAltSetting = %d", dev->id, i, - iface->altsetting [i] + iface->altsetting [i].desc .bAlternateSetting); return -EDOM; } @@ -447,7 +447,7 @@ static int ch9_postconfig (struct usbtest_dev *dev) /* [real world] get_config unimplemented if there's only one */ if (udev->descriptor.bNumConfigurations != 1) { - int expected = udev->actconfig->bConfigurationValue; + int expected = udev->actconfig->desc.bConfigurationValue; /* [9.4.2] get_configuration always works * ... although some cheap devices (like one TI Hub I've got) @@ -534,7 +534,7 @@ static int ch9_postconfig (struct usbtest_dev *dev) // the device's remote wakeup feature ... if we can, test that here retval = usb_get_status (udev, USB_RECIP_INTERFACE, - iface->altsetting [0].bInterfaceNumber, dev->buf); + iface->altsetting [0].desc.bInterfaceNumber, dev->buf); if (retval != 2) { dbg ("%s get interface status --> %d", dev->id, retval); return (retval < 0) ? retval : -EDOM; @@ -591,7 +591,7 @@ static int usbtest_ioctl (struct usb_interface *intf, unsigned int code, void *b if (dev->info->alt >= 0) { int res; - if (intf->altsetting->bInterfaceNumber) + if (intf->altsetting->desc.bInterfaceNumber) return -ENODEV; res = set_altsetting (dev, dev->info->alt); if (res) { @@ -823,7 +823,7 @@ usbtest_probe (struct usb_interface *intf, const struct usb_device_id *id) /* use the same kind of id the hid driver shows */ snprintf (dev->id, sizeof dev->id, "%s-%s:%d", udev->bus->bus_name, udev->devpath, - intf->altsetting [0].bInterfaceNumber); + intf->altsetting [0].desc.bInterfaceNumber); dev->intf = intf; /* cacheline-aligned scratch for i/o */ diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c index b1a4031ef177..57c249c3eb5e 100644 --- a/drivers/usb/net/catc.c +++ b/drivers/usb/net/catc.c @@ -783,7 +783,8 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id u8 broadcast[6]; int i, pktsz; - if (usb_set_interface(usbdev, intf->altsetting->bInterfaceNumber, 1)) { + if (usb_set_interface(usbdev, + intf->altsetting->desc.bInterfaceNumber, 1)) { err("Can't set altsetting 1."); return -EIO; } diff --git a/drivers/usb/net/cdc-ether.c b/drivers/usb/net/cdc-ether.c index 592852aced36..2b9626c44276 100644 --- a/drivers/usb/net/cdc-ether.c +++ b/drivers/usb/net/cdc-ether.c @@ -723,9 +723,9 @@ static int parse_ethernet_class_information( unsigned char *data, int length, et static int find_and_parse_ethernet_class_information( struct usb_device *device, ether_dev_t *ether_dev ) { - struct usb_config_descriptor *conf = NULL; + struct usb_host_config *conf = NULL; struct usb_interface *comm_intf_group = NULL; - struct usb_interface_descriptor *comm_intf = NULL; + struct usb_host_interface *comm_intf = NULL; int rc = -1; // The assumption here is that find_ethernet_comm_interface // and find_valid_configuration @@ -760,9 +760,9 @@ static int find_and_parse_ethernet_class_information( struct usb_device *device, static int get_data_interface_endpoints( struct usb_device *device, ether_dev_t *ether_dev ) { - struct usb_config_descriptor *conf = NULL; + struct usb_host_config *conf = NULL; struct usb_interface *data_intf_group = NULL; - struct usb_interface_descriptor *data_intf = NULL; + struct usb_host_interface *data_intf = NULL; // Walk through and get to the data interface we are checking. conf = &( device->config[ether_dev->configuration_num] ); @@ -774,30 +774,30 @@ static int get_data_interface_endpoints( struct usb_device *device, ether_dev_t ether_dev->data_ep_out = 0; // If these are not BULK endpoints, we don't want them - if ( data_intf->endpoint[0].bmAttributes != 0x02 ) { + if ( data_intf->endpoint[0].desc.bmAttributes != 0x02 ) { return -1; - } if ( data_intf->endpoint[1].bmAttributes != 0x02 ) { + } if ( data_intf->endpoint[1].desc.bmAttributes != 0x02 ) { return -1; } // Check the first endpoint to see if it is IN or OUT - if ( data_intf->endpoint[0].bEndpointAddress & 0x80 ) { + if ( data_intf->endpoint[0].desc.bEndpointAddress & 0x80 ) { // This endpoint is IN - ether_dev->data_ep_in = data_intf->endpoint[0].bEndpointAddress & 0x7F; + ether_dev->data_ep_in = data_intf->endpoint[0].desc.bEndpointAddress & 0x7F; } else { // This endpoint is OUT - ether_dev->data_ep_out = data_intf->endpoint[0].bEndpointAddress & 0x7F; - ether_dev->data_ep_out_size = data_intf->endpoint[0].wMaxPacketSize; + ether_dev->data_ep_out = data_intf->endpoint[0].desc.bEndpointAddress & 0x7F; + ether_dev->data_ep_out_size = data_intf->endpoint[0].desc.wMaxPacketSize; } // Check the second endpoint to see if it is IN or OUT - if ( data_intf->endpoint[1].bEndpointAddress & 0x80 ) { + if ( data_intf->endpoint[1].desc.bEndpointAddress & 0x80 ) { // This endpoint is IN - ether_dev->data_ep_in = data_intf->endpoint[1].bEndpointAddress & 0x7F; + ether_dev->data_ep_in = data_intf->endpoint[1].desc.bEndpointAddress & 0x7F; } else { // This endpoint is OUT - ether_dev->data_ep_out = data_intf->endpoint[1].bEndpointAddress & 0x7F; - ether_dev->data_ep_out_size = data_intf->endpoint[1].wMaxPacketSize; + ether_dev->data_ep_out = data_intf->endpoint[1].desc.bEndpointAddress & 0x7F; + ether_dev->data_ep_out_size = data_intf->endpoint[1].desc.wMaxPacketSize; } // Now make sure we got both an IN and an OUT @@ -811,7 +811,7 @@ static int get_data_interface_endpoints( struct usb_device *device, ether_dev_t static int verify_ethernet_data_interface( struct usb_device *device, ether_dev_t *ether_dev ) { - struct usb_config_descriptor *conf = NULL; + struct usb_host_config *conf = NULL; struct usb_interface *data_intf_group = NULL; struct usb_interface_descriptor *data_intf = NULL; int rc = -1; @@ -834,7 +834,7 @@ static int verify_ethernet_data_interface( struct usb_device *device, ether_dev_ // Walk through every possible setting for this interface until // we find what makes us happy. for ( altset_num = 0; altset_num < data_intf_group->num_altsetting; altset_num++ ) { - data_intf = &( data_intf_group->altsetting[altset_num] ); + data_intf = &( data_intf_group->altsetting[altset_num].desc ); // Is this a data interface we like? if ( ( data_intf->bInterfaceClass == 0x0A ) @@ -875,7 +875,7 @@ static int verify_ethernet_data_interface( struct usb_device *device, ether_dev_ static int find_ethernet_comm_interface( struct usb_device *device, ether_dev_t *ether_dev ) { - struct usb_config_descriptor *conf = NULL; + struct usb_host_config *conf = NULL; struct usb_interface *comm_intf_group = NULL; struct usb_interface_descriptor *comm_intf = NULL; int intf_num; @@ -886,12 +886,12 @@ static int find_ethernet_comm_interface( struct usb_device *device, ether_dev_t // We need to check and see if any of these interfaces are something we want. // Walk through each interface one at a time - for ( intf_num = 0; intf_num < conf->bNumInterfaces; intf_num++ ) { + for ( intf_num = 0; intf_num < conf->desc.bNumInterfaces; intf_num++ ) { comm_intf_group = &( conf->interface[intf_num] ); // Now for each of those interfaces, check every possible // alternate setting. for ( altset_num = 0; altset_num < comm_intf_group->num_altsetting; altset_num++ ) { - comm_intf = &( comm_intf_group->altsetting[altset_num] ); + comm_intf = &( comm_intf_group->altsetting[altset_num].desc); // Is this a communication class of interface of the // ethernet subclass variety. @@ -944,7 +944,7 @@ static int find_ethernet_comm_interface( struct usb_device *device, ether_dev_t static int find_valid_configuration( struct usb_device *device, ether_dev_t *ether_dev ) { - struct usb_config_descriptor *conf = NULL; + struct usb_host_config *conf = NULL; int conf_num; int rc; @@ -953,7 +953,7 @@ static int find_valid_configuration( struct usb_device *device, ether_dev_t *eth conf = &( device->config[conf_num] ); // Our first requirement : 2 interfaces - if ( conf->bNumInterfaces != 2 ) { + if ( conf->desc.bNumInterfaces != 2 ) { // I currently don't know how to handle devices with any number of interfaces // other than 2. continue; @@ -962,7 +962,7 @@ static int find_valid_configuration( struct usb_device *device, ether_dev_t *eth // This one passed our first check, fill in some // useful data ether_dev->configuration_num = conf_num; - ether_dev->bConfigurationValue = conf->bConfigurationValue; + ether_dev->bConfigurationValue = conf->desc.bConfigurationValue; // Now run it through the ringers and see what comes // out the other side. @@ -983,14 +983,14 @@ static int find_valid_configuration( struct usb_device *device, ether_dev_t *eth // has claimed any of the devices interfaces ///////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -static int check_for_claimed_interfaces( struct usb_config_descriptor *config ) +static int check_for_claimed_interfaces( struct usb_host_config *config ) { struct usb_interface *comm_intf_group; int intf_num; // Go through all the interfaces and make sure none are // claimed by anybody else. - for ( intf_num = 0; intf_num < config->bNumInterfaces; intf_num++ ) { + for ( intf_num = 0; intf_num < config->desc.bNumInterfaces; intf_num++ ) { comm_intf_group = &( config->interface[intf_num] ); if ( usb_interface_claimed( comm_intf_group ) ) { // Somebody has beat us to this guy. diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c index 9cd6be09334e..32e669e81758 100644 --- a/drivers/usb/net/kaweth.c +++ b/drivers/usb/net/kaweth.c @@ -449,7 +449,7 @@ static int kaweth_reset(struct kaweth_device *kaweth) usb_sndctrlpipe(kaweth->dev, 0), USB_REQ_SET_CONFIGURATION, 0, - kaweth->dev->config[0].bConfigurationValue, + kaweth->dev->config[0].desc.bConfigurationValue, 0, NULL, 0, diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 50ec09031196..34ed89241550 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c @@ -1061,7 +1061,7 @@ static int pegasus_probe(struct usb_interface *intf, pegasus_t *pegasus; int dev_index = id - pegasus_ids; - if (usb_set_configuration(dev, dev->config[0].bConfigurationValue)) { + if (usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue)) { err("usb_set_configuration() failed"); return -ENODEV; } diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index f2bfc2b729b0..bb38b4caa353 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c @@ -789,7 +789,7 @@ static int rtl8150_probe(struct usb_interface *intf, rtl8150_t *dev; struct net_device *netdev; - if (usb_set_configuration(udev, udev->config[0].bConfigurationValue)) { + if (usb_set_configuration(udev, udev->config[0].desc.bConfigurationValue)) { err("usb_set_configuration() failed"); return -EIO; } diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index 021a88e0ac3f..69a67505b02c 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c @@ -2125,7 +2125,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) { struct usbnet *dev; struct net_device *net; - struct usb_interface_descriptor *interface; + struct usb_host_interface *interface; struct driver_info *info; struct usb_device *xdev; @@ -2135,8 +2135,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) interface = &udev->altsetting [udev->act_altsetting]; if (!(info->flags & FLAG_NO_SETINT)) { - if (usb_set_interface (xdev, interface->bInterfaceNumber, - interface->bAlternateSetting) < 0) { + if (usb_set_interface (xdev, interface->desc.bInterfaceNumber, + interface->desc.bAlternateSetting) < 0) { err ("set_interface failed"); return -EIO; } diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 4cb3cb879e1b..04e252d7b63b 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -1147,7 +1147,7 @@ int usb_serial_probe(struct usb_interface *interface, struct usb_device *dev = interface_to_usbdev (interface); struct usb_serial *serial = NULL; struct usb_serial_port *port; - struct usb_interface_descriptor *iface_desc; + struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; struct usb_endpoint_descriptor *interrupt_in_endpoint[MAX_NUM_PORTS]; struct usb_endpoint_descriptor *bulk_in_endpoint[MAX_NUM_PORTS]; @@ -1208,8 +1208,8 @@ int usb_serial_probe(struct usb_interface *interface, /* descriptor matches, let's find the endpoints needed */ /* check out the endpoints */ iface_desc = &interface->altsetting[0]; - for (i = 0; i < iface_desc->bNumEndpoints; ++i) { - endpoint = &iface_desc->endpoint[i]; + for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { + endpoint = &iface_desc->endpoint[i].desc; if ((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x02)) { @@ -1249,7 +1249,7 @@ int usb_serial_probe(struct usb_interface *interface, //interface = &dev->actconfig->interface[ifnum ^ 1]; interface = &dev->actconfig->interface[0]; iface_desc = &interface->altsetting[0]; - for (i = 0; i < iface_desc->bNumEndpoints; ++i) { + for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { endpoint = &iface_desc->endpoint[i]; if ((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x03)) { diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 928b739597b4..1db93f62063c 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -249,7 +249,7 @@ static int bus_reset( Scsi_Cmnd *srb ) /* FIXME: This needs to lock out driver probing while it's working * or we can have race conditions */ /* This functionality really should be provided by the khubd thread */ - for (i = 0; i < pusb_dev_save->actconfig->bNumInterfaces; i++) { + for (i = 0; i < pusb_dev_save->actconfig->desc.bNumInterfaces; i++) { struct usb_interface *intf = &pusb_dev_save->actconfig->interface[i]; diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index b31328917e5c..445cb612db2a 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -646,7 +646,7 @@ static int storage_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); - int ifnum = intf->altsetting->bInterfaceNumber; + int ifnum = intf->altsetting->desc.bInterfaceNumber; int i; const int id_index = id - storage_usb_ids; char mf[USB_STOR_STRING_LEN]; /* manufacturer */ @@ -671,7 +671,7 @@ static int storage_probe(struct usb_interface *intf, /* the altsetting on the interface we're probing that matched our * usb_match_id table */ - struct usb_interface_descriptor *altsetting = + struct usb_host_interface *altsetting = intf[ifnum].altsetting + intf[ifnum].act_altsetting; US_DEBUGP("act_altsetting is %d\n", intf[ifnum].act_altsetting); @@ -716,22 +716,25 @@ static int storage_probe(struct usb_interface *intf, * An optional interrupt is OK (necessary for CBI protocol). * We will ignore any others. */ - for (i = 0; i < altsetting->bNumEndpoints; i++) { + for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { + struct usb_endpoint_descriptor *ep; + + ep = &altsetting->endpoint[i].desc; + /* is it an BULK endpoint? */ - if ((altsetting->endpoint[i].bmAttributes & - USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) { + if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) + == USB_ENDPOINT_XFER_BULK) { /* BULK in or out? */ - if (altsetting->endpoint[i].bEndpointAddress & - USB_DIR_IN) - ep_in = &altsetting->endpoint[i]; + if (ep->bEndpointAddress & USB_DIR_IN) + ep_in = ep; else - ep_out = &altsetting->endpoint[i]; + ep_out = ep; } /* is it an interrupt endpoint? */ - if ((altsetting->endpoint[i].bmAttributes & - USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) { - ep_int = &altsetting->endpoint[i]; + else if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) + == USB_ENDPOINT_XFER_INT) { + ep_int = ep; } } US_DEBUGP("Endpoints: In: 0x%p Out: 0x%p Int: 0x%p (Period %d)\n", diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index b267c949d957..97aa1a3556db 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c @@ -555,7 +555,7 @@ static int skel_probe(struct usb_interface *interface, const struct usb_device_i /* check out the endpoints */ iface_desc = &interface->altsetting[0]; for (i = 0; i < iface_desc->bNumEndpoints; ++i) { - endpoint = &iface_desc->endpoint[i]; + endpoint = &iface_desc->endpoint[i].desc; if ((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x02)) { diff --git a/include/linux/usb.h b/include/linux/usb.h index 1d9873868a90..0f486d95bdb7 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -41,56 +41,36 @@ struct usb_device; /*-------------------------------------------------------------------------*/ /* - * Standard USB Descriptor support. + * Host-side wrappers for standard USB descriptors ... these are parsed + * from the data provided by devices. Parsing turns them from a flat + * sequence of descriptors into a hierarchy: + * + * - devices have one (usually) or more configs; + * - configs have one (often) or more interfaces; + * - interfaces have one (usually) or more settings; + * - each interface setting has zero or (usually) more endpoints. + * + * And there might be other descriptors mixed in with those. + * * Devices may also have class-specific or vendor-specific descriptors. */ -/* - * Descriptor sizes per descriptor type - */ -#define USB_DT_DEVICE_SIZE 18 -#define USB_DT_CONFIG_SIZE 9 -#define USB_DT_INTERFACE_SIZE 9 -#define USB_DT_ENDPOINT_SIZE 7 -#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ - -/* most of these maximums are arbitrary */ -#define USB_MAXCONFIG 8 -#define USB_ALTSETTINGALLOC 4 -#define USB_MAXALTSETTING 128 /* Hard limit */ -#define USB_MAXINTERFACES 32 -#define USB_MAXENDPOINTS 32 /* Hard limit */ - -/* USB_DT_ENDPOINT: Endpoint descriptor */ -struct usb_endpoint_descriptor { - __u8 bLength __attribute__ ((packed)); - __u8 bDescriptorType __attribute__ ((packed)); - __u8 bEndpointAddress __attribute__ ((packed)); - __u8 bmAttributes __attribute__ ((packed)); - __u16 wMaxPacketSize __attribute__ ((packed)); - __u8 bInterval __attribute__ ((packed)); - __u8 bRefresh __attribute__ ((packed)); - __u8 bSynchAddress __attribute__ ((packed)); - - /* the rest is internal to the Linux implementation */ +/* host-side wrapper for parsed endpoint descriptors */ +struct usb_host_endpoint { + struct usb_endpoint_descriptor desc; + unsigned char *extra; /* Extra descriptors */ int extralen; }; -/* USB_DT_INTERFACE: Interface descriptor */ -struct usb_interface_descriptor { - __u8 bLength __attribute__ ((packed)); - __u8 bDescriptorType __attribute__ ((packed)); - __u8 bInterfaceNumber __attribute__ ((packed)); - __u8 bAlternateSetting __attribute__ ((packed)); - __u8 bNumEndpoints __attribute__ ((packed)); - __u8 bInterfaceClass __attribute__ ((packed)); - __u8 bInterfaceSubClass __attribute__ ((packed)); - __u8 bInterfaceProtocol __attribute__ ((packed)); - __u8 iInterface __attribute__ ((packed)); - - /* the rest is internal to the Linux implementation */ - struct usb_endpoint_descriptor *endpoint; +/* host-side wrapper for one interface setting's parsed descriptors */ +struct usb_host_interface { + struct usb_interface_descriptor desc; + + /* array of desc.bNumEndpoint endpoints associated with this + * interface setting. these will be in no particular order. + */ + struct usb_host_endpoint *endpoint; unsigned char *extra; /* Extra descriptors */ int extralen; @@ -127,7 +107,10 @@ struct usb_interface_descriptor { * will use them in non-default settings. */ struct usb_interface { - struct usb_interface_descriptor *altsetting; + /* array of alternate settings for this interface. + * these will be in numeric order, 0..num_altsettting + */ + struct usb_host_interface *altsetting; unsigned act_altsetting; /* active alternate setting */ unsigned num_altsetting; /* number of alternate settings */ @@ -148,17 +131,12 @@ struct usb_interface { * different depending on what speed they're currently running. Only * devices with a USB_DT_DEVICE_QUALIFIER have an OTHER_SPEED_CONFIG. */ -struct usb_config_descriptor { - __u8 bLength __attribute__ ((packed)); - __u8 bDescriptorType __attribute__ ((packed)); - __u16 wTotalLength __attribute__ ((packed)); - __u8 bNumInterfaces __attribute__ ((packed)); - __u8 bConfigurationValue __attribute__ ((packed)); - __u8 iConfiguration __attribute__ ((packed)); - __u8 bmAttributes __attribute__ ((packed)); - __u8 MaxPower __attribute__ ((packed)); - - /* the rest is internal to the Linux implementation */ +struct usb_host_config { + struct usb_config_descriptor desc; + + /* the interfaces associated with this configuration + * these will be in numeric order, 0..desc.bNumInterfaces + */ struct usb_interface *interface; unsigned char *extra; /* Extra descriptors */ @@ -178,8 +156,6 @@ int __usb_get_extra_descriptor(char *buffer, unsigned size, /* -------------------------------------------------------------------------- */ -/* Host Controller Driver (HCD) support */ - struct usb_operations; /* @@ -248,8 +224,8 @@ struct usb_device { struct device dev; /* Generic device interface */ struct usb_device_descriptor descriptor;/* Descriptor */ - struct usb_config_descriptor *config; /* All of the configs */ - struct usb_config_descriptor *actconfig;/* the active configuration */ + struct usb_host_config *config; /* All of the configs */ + struct usb_host_config *actconfig;/* the active configuration */ char **rawdescriptors; /* Raw descriptors for each config */ diff --git a/include/linux/usb_ch9.h b/include/linux/usb_ch9.h index 9e05b8c05004..69645ae25aae 100644 --- a/include/linux/usb_ch9.h +++ b/include/linux/usb_ch9.h @@ -6,7 +6,7 @@ * * - the master/host side Linux-USB kernel driver API; * - the "usbfs" user space API; and - * - (eventually) a Linux slave/device side driver API. + * - (eventually) a Linux "gadget" slave/device side driver API. * * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems * act either as a USB master/host or as a USB slave/device. That means @@ -101,7 +101,8 @@ struct usb_ctrlrequest { * (rarely) accepted by SET_DESCRIPTOR. * * Note that all multi-byte values here are encoded in little endian - * byte order. + * byte order "on the wire". But when exposed through Linux-USB APIs, + * they've been converted to cpu byte order. */ /* @@ -123,10 +124,13 @@ struct usb_descriptor_header { } __attribute__ ((packed)); +/*-------------------------------------------------------------------------*/ + /* USB_DT_DEVICE: Device descriptor */ struct usb_device_descriptor { __u8 bLength; __u8 bDescriptorType; + __u16 bcdUSB; __u8 bDeviceClass; __u8 bDeviceSubClass; @@ -141,10 +145,12 @@ struct usb_device_descriptor { __u8 bNumConfigurations; } __attribute__ ((packed)); +#define USB_DT_DEVICE_SIZE 18 + /* * Device and/or Interface Class codes - * as found in device and interface descriptors + * as found in bDeviceClass or bInterfaceClass * and defined by www.usb.org documents */ #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ @@ -162,18 +168,88 @@ struct usb_device_descriptor { #define USB_CLASS_APP_SPEC 0xfe #define USB_CLASS_VENDOR_SPEC 0xff -// FIXME include struct usb_config_descriptor +/*-------------------------------------------------------------------------*/ + +/* USB_DT_CONFIG: Configuration descriptor information. + * + * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the + * descriptor type is different. Highspeed-capable devices can look + * different depending on what speed they're currently running. Only + * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG + * descriptors. + */ +struct usb_config_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u16 wTotalLength; + __u8 bNumInterfaces; + __u8 bConfigurationValue; + __u8 iConfiguration; + __u8 bmAttributes; + __u8 bMaxPower; +} __attribute__ ((packed)); + +#define USB_DT_CONFIG_SIZE 9 + +/* from config descriptor bmAttributes */ +#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ +#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ +#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ + +/*-------------------------------------------------------------------------*/ /* USB_DT_STRING: String descriptor */ struct usb_string_descriptor { __u8 bLength; __u8 bDescriptorType; + __u16 wData[1]; /* UTF-16LE encoded */ } __attribute__ ((packed)); -// FIXME include struct usb_interface_descriptor +/* note that "string" zero is special, it holds language codes that + * the device supports, not Unicode characters. + */ + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_INTERFACE: Interface descriptor */ +struct usb_interface_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u8 bInterfaceNumber; + __u8 bAlternateSetting; + __u8 bNumEndpoints; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 iInterface; +} __attribute__ ((packed)); + +#define USB_DT_INTERFACE_SIZE 9 + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_ENDPOINT: Endpoint descriptor */ +struct usb_endpoint_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u8 bEndpointAddress; + __u8 bmAttributes; + __u16 wMaxPacketSize; + __u8 bInterval; + + // NOTE: these two are _only_ in audio endpoints. + // use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. + __u8 bRefresh; + __u8 bSynchAddress; +} __attribute__ ((packed)); + +#define USB_DT_ENDPOINT_SIZE 7 +#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ -// FIXME include struct usb_endpoint_descriptor /* * Endpoints @@ -188,10 +264,13 @@ struct usb_string_descriptor { #define USB_ENDPOINT_XFER_INT 3 +/*-------------------------------------------------------------------------*/ + /* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ struct usb_qualifier_descriptor { __u8 bLength; __u8 bDescriptorType; + __u16 bcdUSB; __u8 bDeviceClass; __u8 bDeviceSubClass; diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 71186aa31378..2c40ea8cffe4 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -933,8 +933,8 @@ static struct audioformat *find_format(snd_usb_substream_t *subs, snd_pcm_runtim static int set_format(snd_usb_substream_t *subs, snd_pcm_runtime_t *runtime) { struct usb_device *dev = subs->dev; - struct usb_config_descriptor *config = dev->actconfig; - struct usb_interface_descriptor *alts; + struct usb_host_config *config = dev->actconfig; + struct usb_host_interface *alts; struct usb_interface *iface; struct audioformat *fmt; unsigned int ep, attr; @@ -951,7 +951,7 @@ static int set_format(snd_usb_substream_t *subs, snd_pcm_runtime_t *runtime) iface = &config->interface[fmt->iface]; alts = &iface->altsetting[fmt->altset_idx]; - snd_assert(alts->bAlternateSetting == fmt->altsetting, return -EINVAL); + snd_assert(alts->desc.bAlternateSetting == fmt->altsetting, return -EINVAL); /* close the old interface */ if (subs->interface >= 0 && subs->interface != fmt->iface) { @@ -973,31 +973,31 @@ static int set_format(snd_usb_substream_t *subs, snd_pcm_runtime_t *runtime) } /* create a data pipe */ - ep = alts->endpoint[0].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; + ep = alts->endpoint[0].desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; if (is_playback) subs->datapipe = usb_sndisocpipe(dev, ep); else subs->datapipe = usb_rcvisocpipe(dev, ep); subs->syncpipe = subs->syncinterval = 0; - subs->maxpacksize = alts->endpoint[0].wMaxPacketSize; + subs->maxpacksize = alts->endpoint[0].desc.wMaxPacketSize; subs->maxframesize = bytes_to_frames(runtime, subs->maxpacksize); subs->fill_max = 0; /* we need a sync pipe in async OUT or adaptive IN mode */ - attr = alts->endpoint[0].bmAttributes & EP_ATTR_MASK; + attr = alts->endpoint[0].desc.bmAttributes & EP_ATTR_MASK; if ((is_playback && attr == EP_ATTR_ASYNC) || (! is_playback && attr == EP_ATTR_ADAPTIVE)) { /* check endpoint */ - if (alts->bNumEndpoints < 2 || - alts->endpoint[1].bmAttributes != 0x01 || - alts->endpoint[1].bSynchAddress != 0) { + if (alts->desc.bNumEndpoints < 2 || + alts->endpoint[1].desc.bmAttributes != 0x01 || + alts->endpoint[1].desc.bSynchAddress != 0) { snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n", dev->devnum, fmt->iface, fmt->altsetting); return -EINVAL; } - ep = alts->endpoint[1].bEndpointAddress; - if ((is_playback && ep != (alts->endpoint[0].bSynchAddress | USB_DIR_IN)) || - (! is_playback && ep != (alts->endpoint[0].bSynchAddress & ~USB_DIR_IN))) { + ep = alts->endpoint[1].desc.bEndpointAddress; + if ((is_playback && ep != (alts->endpoint[0].desc.bSynchAddress | USB_DIR_IN)) || + (! is_playback && ep != (alts->endpoint[0].desc.bSynchAddress & ~USB_DIR_IN))) { snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n", dev->devnum, fmt->iface, fmt->altsetting); return -EINVAL; @@ -1007,10 +1007,10 @@ static int set_format(snd_usb_substream_t *subs, snd_pcm_runtime_t *runtime) subs->syncpipe = usb_rcvisocpipe(dev, ep); else subs->syncpipe = usb_sndisocpipe(dev, ep); - subs->syncinterval = alts->endpoint[1].bRefresh; + subs->syncinterval = alts->endpoint[1].desc.bRefresh; } - ep = alts->endpoint[0].bEndpointAddress; + ep = alts->endpoint[0].desc.bEndpointAddress; /* if endpoint has pitch control, enable it */ if (fmt->attributes & EP_CS_ATTR_PITCH_CONTROL) { data[0] = 1; @@ -1673,9 +1673,9 @@ static int parse_audio_format_type(struct usb_device *dev, int iface_no, int alt static int parse_audio_endpoints(snd_usb_audio_t *chip, unsigned char *buffer, int buflen, int iface_no) { struct usb_device *dev; - struct usb_config_descriptor *config; + struct usb_host_config *config; struct usb_interface *iface; - struct usb_interface_descriptor *alts; + struct usb_host_interface *alts; int i, altno, err, stream; int channels, nr_rates, pcm_format, format; struct audioformat *fp; @@ -1689,18 +1689,18 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, unsigned char *buffer, i for (i = 0; i < iface->num_altsetting; i++) { alts = &iface->altsetting[i]; /* skip invalid one */ - if (alts->bInterfaceClass != USB_CLASS_AUDIO || - alts->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING || - alts->bNumEndpoints < 1) + if (alts->desc.bInterfaceClass != USB_CLASS_AUDIO || + alts->desc.bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING || + alts->desc.bNumEndpoints < 1) continue; /* must be isochronous */ - if ((alts->endpoint[0].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != + if ((alts->endpoint[0].desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_ISOC) continue; /* check direction */ - stream = (alts->endpoint[0].bEndpointAddress & USB_DIR_IN) ? + stream = (alts->endpoint[0].desc.bEndpointAddress & USB_DIR_IN) ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; - altno = alts->bAlternateSetting; + altno = alts->desc.bAlternateSetting; /* get audio formats */ fmt = snd_usb_find_csint_desc(buffer, buflen, NULL, AS_GENERAL, iface_no, altno); @@ -1767,8 +1767,8 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, unsigned char *buffer, i fp->altsetting = altno; fp->altset_idx = i; fp->format = pcm_format; - fp->endpoint = alts->endpoint[0].bEndpointAddress; - fp->ep_attr = alts->endpoint[0].bmAttributes; + fp->endpoint = alts->endpoint[0].desc.bEndpointAddress; + fp->ep_attr = alts->endpoint[0].desc.bmAttributes; fp->channels = channels; fp->attributes = csep[3]; @@ -1837,7 +1837,7 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif, unsigned char *buffer, int buflen) { struct usb_device *dev = chip->dev; - struct usb_config_descriptor *config; + struct usb_host_config *config; struct usb_interface *iface; unsigned char *p1; int i, j; @@ -1858,7 +1858,7 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif, config = dev->actconfig; for (i = 0; i < p1[7]; i++) { j = p1[8 + i]; - if (j >= config->bNumInterfaces) { + if (j >= config->desc.bNumInterfaces) { snd_printk(KERN_ERR "%d:%u:%d : does not exist\n", dev->devnum, ctrlif, j); continue; @@ -1868,8 +1868,8 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif, snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", dev->devnum, ctrlif, j); continue; } - if (iface->altsetting[0].bInterfaceClass == USB_CLASS_AUDIO && - iface->altsetting[0].bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) { + if (iface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO && + iface->altsetting[0].desc.bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) { if (snd_usb_create_midi_interface(chip, iface, NULL) < 0) { snd_printk(KERN_ERR "%d:%u:%d: cannot create sequencer device\n", dev->devnum, ctrlif, j); continue; @@ -1877,8 +1877,8 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif, usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1); continue; } - if (iface->altsetting[0].bInterfaceClass != USB_CLASS_AUDIO || - iface->altsetting[0].bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) { + if (iface->altsetting[0].desc.bInterfaceClass != USB_CLASS_AUDIO || + iface->altsetting[0].desc.bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) { snd_printdd(KERN_ERR "%d:%u:%d: skipping non-supported interface %d\n", dev->devnum, ctrlif, j, iface->altsetting[0].bInterfaceClass); /* skip non-supported classes */ continue; diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index d68e7f2b42bb..6892e16fd1f3 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c @@ -526,20 +526,20 @@ static struct usb_endpoint_descriptor* snd_usbmidi_get_int_epd(snd_usb_midi_t* u return NULL; intfd = &intf->altsetting[0]; - if (intfd->bNumEndpoints != 2 || - (intfd->endpoint[0].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK || - (intfd->endpoint[1].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK) + if (intfd->desc.bNumEndpoints != 2 || + (intfd->endpoint[0].desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK || + (intfd->endpoint[1].desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK) return NULL; intfd = &intf->altsetting[1]; - if (intfd->bNumEndpoints != 2 || - (intfd->endpoint[0].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK || - (intfd->endpoint[1].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) + if (intfd->desc.bNumEndpoints != 2 || + (intfd->endpoint[0].desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK || + (intfd->endpoint[1].desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) return NULL; - usb_set_interface(umidi->chip->dev, intfd->bInterfaceNumber, - intfd->bAlternateSetting); - return &intfd->endpoint[1]; + usb_set_interface(umidi->chip->dev, intfd->desc.bInterfaceNumber, + intfd->desc.bAlternateSetting); + return &intfd->endpoint[1].desc; } static struct usb_endpoint_descriptor* snd_usbmidi_get_midiman_int_epd(snd_usb_midi_t* umidi) @@ -547,7 +547,7 @@ static struct usb_endpoint_descriptor* snd_usbmidi_get_midiman_int_epd(snd_usb_m struct usb_interface* intf = umidi->iface; if (!intf || intf->altsetting[0].bNumEndpoints < 1) return NULL; - return &intf->altsetting[0].endpoint[0]; + return &intf->altsetting[0].endpoint[0].desc; } /* @@ -843,9 +843,9 @@ static int snd_usbmidi_detect_endpoint(snd_usb_midi_t* umidi, if (!intf || intf->num_altsetting < 1) return -ENOENT; intfd = intf->altsetting; - if (intfd->bNumEndpoints < 1) + if (intfd->desc.bNumEndpoints < 1) return -ENOENT; - epd = intfd->endpoint; + epd = &intfd->endpoint [0].desc; endpoint->epnum = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; } return 0; @@ -900,25 +900,25 @@ static int snd_usbmidi_create_endpoints_midiman(snd_usb_midi_t* umidi, int ports if (!intf) return -ENOENT; intfd = intf->altsetting; - if (intfd->bNumEndpoints < (ports > 1 ? 5 : 3)) { + if (intfd->desc.bNumEndpoints < (ports > 1 ? 5 : 3)) { snd_printdd(KERN_ERR "not enough endpoints\n"); return -ENOENT; } - epd = &intfd->endpoint[0]; + epd = &intfd->endpoint[0].desc; if ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) != USB_DIR_IN || (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) { snd_printdd(KERN_ERR "endpoint[0] isn't interrupt\n"); return -ENXIO; } - epd = &intfd->endpoint[2]; + epd = &intfd->endpoint[2].desc; if ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) != USB_DIR_OUT || (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK) { snd_printdd(KERN_ERR "endpoint[2] isn't bulk output\n"); return -ENXIO; } if (ports > 1) { - epd = &intfd->endpoint[4]; + epd = &intfd->endpoint[4].desc; if ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) != USB_DIR_OUT || (epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK) { snd_printdd(KERN_ERR "endpoint[4] isn't bulk output\n"); @@ -926,13 +926,13 @@ static int snd_usbmidi_create_endpoints_midiman(snd_usb_midi_t* umidi, int ports } } - ep_info.epnum = intfd->endpoint[2].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; + ep_info.epnum = intfd->endpoint[2].desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; ep_info.out_cables = 0x5555 & ((1 << ports) - 1); err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]); if (err < 0) return err; - ep_info.epnum = intfd->endpoint[0].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; + ep_info.epnum = intfd->endpoint[0].desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; ep_info.in_cables = (1 << ports) - 1; err = snd_usbmidi_in_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]); if (err < 0) @@ -940,7 +940,7 @@ static int snd_usbmidi_create_endpoints_midiman(snd_usb_midi_t* umidi, int ports umidi->endpoints[0].in->urb->complete = snd_usbmidi_in_midiman_complete; if (ports > 1) { - ep_info.epnum = intfd->endpoint[4].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; + ep_info.epnum = intfd->endpoint[4].desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; ep_info.out_cables = 0xaaaa & ((1 << ports) - 1); err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[1]); if (err < 0) -- cgit v1.2.3