Cleanup + minor fix for acm.c

Pavel Machek (pavel@bug.ucw.cz)
Tue, 21 Sep 1999 23:22:55 +0200


Hi!

This is cleanup + few fixes for drivers/usb/acm.c. Please apply.

Pavel
--- clean//drivers/usb/acm.c Sat Sep 11 20:56:01 1999
+++ linux/drivers/usb/acm.c Tue Sep 21 23:20:34 1999
@@ -1,7 +1,11 @@
/*
* USB Abstract Control Model based on Brad Keryan's USB busmouse driver
*
- * Armin Fuerst 5/8/1999
+ * Armin Fuerst 5/8/1999 <armin.please@put.your.email.here.!!!!>
+ *
+ * version 0.8: Fixed endianity bug, some cleanups. I really hate to have
+ * half of driver in form if (...) { info("x"); return y; }
+ * Pavel Machek <pavel@suse.de>
*
* version 0.7: Added usb flow control. Fixed bug in uhci.c (what idiot
* wrote this code? ...Oops that was me). Fixed module cleanup. Did some
@@ -63,8 +67,8 @@
#define NR_PORTS 3
#define ACM_MAJOR 166

-#define info(message); printk(message);
-//#define info(message);
+//#define info(message...); printk(message);
+#define info(message...);

#define CTRL_STAT_DTR 1
#define CTRL_STAT_RTS 2
@@ -94,6 +98,7 @@
unsigned ctrlinterval; //interval to poll from device
};

+#define ACM_READY (acm->present && acm->active)

//functions for various ACM requests

@@ -139,20 +144,16 @@

info("ACM_USB_IRQ\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
+ if (!acm->present)
return 0;
- }
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
+ if (!acm->active)
return 1;
- }

dr=__buffer;
data=__buffer;
data+=sizeof(dr);

-#if 1
+#if 0
printk("reqtype: %02X\n",dr->requesttype);
printk("request: %02X\n",dr->request);
printk("wValue: %02X\n",dr->value);
@@ -161,31 +162,26 @@
#endif

switch(dr->request) {
- //Network connection
- case 0x00:
- printk("Network connection: ");
- if (dr->request==0) info("disconnected\n");
- if (dr->request==1) info("connected\n");
- break;
+ case 0x00: /* Network connection */
+ printk("Network connection: ");
+ if (dr->request==0) printk("disconnected\n");
+ if (dr->request==1) printk("connected\n");
+ break;

- //Response available
- case 0x01:
- printk("Response available\n");
- break;
-
- //Set serial line state
- case 0x20:
- printk("Set serial control line state\n");
- if ((dr->index==1)&&(dr->length==2)) {
- acm->ctrlstate=* ((unsigned short int *)data);
- printk("Serstate: %02X\n",acm->ctrlstate);
- }
- break;
- }
-
- //info("Done\n");
- //Continue transfer
- return 1;
+ case 0x01: /* Response available */
+ printk("Response available\n");
+ break;
+
+ case 0x20: /* Set serial line state */
+ printk("acm.c: Set serial control line state\n");
+ if ((dr->index==1)&&(dr->length==2)) {
+ acm->ctrlstate= data[0] || (data[1] << 16);
+ printk("Serstate: %02X\n",acm->ctrlstate);
+ }
+ break;
+ }
+
+ return 1; /* Continue transfer */
}

static int acm_read_irq(int state, void *__buffer, int count, void *dev_id)
@@ -195,29 +191,20 @@
unsigned char* data=__buffer;
int i;

- info("ACM_READ_IRQ\n");
-
- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- //Stop transfer
- return 0;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
- //Stop transfer
- return 0;
+ info("ACM_READ_IRQ: state %d, %d bytes\n", state, count);
+ if (state) {
+ printk( "acm_read_irq: strange state received: %x\n", state );
+ return 1;
}
+
+ if (!ACM_READY)
+ return 0; /* stop transfer */

-// printk("%d %s\n",count,data);
- for (i=0;i<count;i++) {
- tty_insert_flip_char(tty,data[i],0);
- }
+ for (i=0;i<count;i++)
+ tty_insert_flip_char(tty,data[i],0);
tty_flip_buffer_push(tty);
-
- //info("Done\n");
- //Continue transfer
- return 1;
+
+ return 1; /* continue transfer */
}

static int acm_write_irq(int state, void *__buffer, int count, void *dev_id)
@@ -227,16 +214,8 @@

info("ACM_WRITE_IRQ\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- //Stop transfer
- return 0;
- }
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
- //Stop transfer
- return 0;
- }
+ if (!ACM_READY)
+ return 0; /* stop transfer */

usb_terminate_bulk(acm->dev, acm->writetransfer);
acm->writing=0;
@@ -244,9 +223,7 @@
(tty->ldisc.write_wakeup)(tty);
wake_up_interruptible(&tty->write_wait);

- //info("Done\n");
- //Stop transfer
- return 0;
+ return 0; /* stop tranfer */
}

/*TTY STUFF*/
@@ -260,22 +237,16 @@
tty->driver_data=acm=&acm_state_table[MINOR(tty->device)-tty->driver.minor_start];
acm->tty=tty;

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
+ if (!acm->present)
return -EINVAL;
- }

- if (acm->active) {
- info ("ACM DEVICE ALREADY OPEN\n");
- return -EINVAL;
- }
- acm->active=1;
+ if (acm->active++)
+ return 0;

- /*Start reading from the device*/
+ /* Start reading from the device */
ret = usb_request_irq(acm->dev,acm->ctrlpipe, acm_irq, acm->ctrlinterval, acm, &acm->ctrltransfer);
- if (ret) {
+ if (ret)
printk (KERN_WARNING "usb-acm: usb_request_irq failed (0x%x)\n", ret);
- }
acm->reading=1;
acm->readtransfer=usb_request_bulk(acm->dev,acm->readpipe, acm_read_irq, acm->readbuffer, acm->readsize, acm);

@@ -289,15 +260,11 @@
struct acm_state *acm = (struct acm_state *) tty->driver_data;
info("rs_close\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
+ if (!acm->present)
return;
- }

- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
+ if (--acm->active)
return;
- }

Set_Control_Line_Status (0, acm);

@@ -309,9 +276,7 @@
usb_terminate_bulk(acm->dev, acm->readtransfer);
acm->reading=0;
}
-// usb_release_irq(acm->dev,acm->ctrltransfer, acm->ctrlpipe);
-
- acm->active=0;
+// usb_release_irq(acm->dev,acm->ctrltransfer, acm->ctrlpipe);
}

static int rs_write(struct tty_struct * tty, int from_user,
@@ -322,15 +287,8 @@

info("rs_write\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- return -EINVAL;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
+ if (!ACM_READY)
return -EINVAL;
- }

if (acm->writing) {
info ("already writing\n");
@@ -339,14 +297,8 @@

written=(count>acm->writesize) ? acm->writesize : count;

- if (from_user) {
- //info("fromuser\n");
- copy_from_user(acm->writebuffer,buf,written);
- }
- else {
- //info("notfromuser\n");
- memcpy(acm->writebuffer,buf,written);
- }
+ if (from_user) copy_from_user(acm->writebuffer,buf,written);
+ else memcpy(acm->writebuffer,buf,written);

//start the transfer
acm->writing=1;
@@ -359,18 +311,8 @@
{
struct acm_state *acm = (struct acm_state *) tty->driver_data;

- info("rs_put_char\n");
-
- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- return;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
- return;
- }
-// printk("%c\n",ch);
+ printk( "acm: rs_put_char: Who called this unsupported routine?\n" );
+ BUG();
}

static int rs_write_room(struct tty_struct *tty)
@@ -379,42 +321,22 @@

info("rs_write_room\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- return -EINVAL;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
+ if (!ACM_READY)
return -EINVAL;
- }

- if (acm->writing) {
- return 0;
- }
- return acm->writesize;
+ return acm->writing ? 0 : acm->writesize;
}

static int rs_chars_in_buffer(struct tty_struct *tty)
{
struct acm_state *acm = (struct acm_state *) tty->driver_data;

- info("rs_chars_in_buffer\n");
+// info("rs_chars_in_buffer\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
+ if (!ACM_READY)
return -EINVAL;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
- return -EINVAL;
- }

- if (acm->writing) {
- return acm->writesize;
- }
- return 0;
+ return acm->writing ? acm->writesize : 0;
}

static void rs_throttle(struct tty_struct * tty)
@@ -423,21 +345,12 @@

info("rs_throttle\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- return;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
+ if (!ACM_READY)
return;
- }
-
/*
if (I_IXOFF(tty))
rs_send_xchar(tty, STOP_CHAR(tty));
*/
-
if (tty->termios->c_cflag & CRTSCTS)
Set_Control_Line_Status (acm->ctrlstate & ~CTRL_STAT_RTS, acm);
}
@@ -448,21 +361,12 @@

info("rs_unthrottle\n");

- if (!acm->present) {
- info("NO ACM DEVICE REGISTERED\n");
- return;
- }
-
- if (!acm->active) {
- info ("ACM DEVICE NOT OPEN\n");
+ if (!ACM_READY)
return;
- }
-
/*
if (I_IXOFF(tty))
rs_send_xchar(tty, STOP_CHAR(tty));
*/
-
if (tty->termios->c_cflag & CRTSCTS)
Set_Control_Line_Status (acm->ctrlstate | CTRL_STAT_RTS, acm);
}
@@ -578,10 +482,8 @@

info("acm_disconnect\n");

- if (!acm->present) {
- printk("device not present\n");
+ if (!acm->present)
return;
- }

printk("disconnecting\n");

@@ -593,7 +495,7 @@
usb_terminate_bulk(acm->dev, acm->readtransfer);
acm->reading=0;
}
-// usb_release_irq(acm->dev,acm->ctrltransfer, acm->ctrlpipe);
+ usb_release_irq(acm->dev,acm->ctrltransfer, acm->ctrlpipe);
//BUG: What to do if a device is open?? Notify process or not allow cleanup?
acm->active=0;
acm->present=0;
@@ -643,9 +545,9 @@
acm_tty_driver.open = rs_open;
acm_tty_driver.close = rs_close;
acm_tty_driver.write = rs_write;
- acm_tty_driver.put_char = rs_put_char; //FUCKIN BUG IN DOKU!!!
+ acm_tty_driver.put_char = rs_put_char;
acm_tty_driver.flush_chars = NULL; //rs_flush_chars;
- acm_tty_driver.write_room = rs_write_room; //ANBOTHER FUCKIN BUG!!
+ acm_tty_driver.write_room = rs_write_room;
acm_tty_driver.ioctl = NULL; //rs_ioctl;
acm_tty_driver.set_termios = NULL; //rs_set_termios;
acm_tty_driver.set_ldisc = NULL;

-- 
I'm really pavel@ucw.cz. Look at http://195.113.31.123/~pavel.  Pavel
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/