Named serial ports.
authorFlorian Pose <fp@igh-essen.com>
Fri, 22 Jan 2010 17:25:36 +0100
changeset 1785 9ed0334edaf9
parent 1784 bc2aff866a5b
child 1786 7198caede741
Named serial ports.
examples/tty/serial.c
--- a/examples/tty/serial.c	Fri Jan 22 17:01:00 2010 +0100
+++ b/examples/tty/serial.c	Fri Jan 22 17:25:36 2010 +0100
@@ -60,8 +60,11 @@
     SER_SET_DATA_FRAME,
 } el60xx_port_state;
 
+#define EL6002_PORT_NAME_SIZE 16
+
 typedef struct {
     ec_tty_t *tty;
+    char name[EL6002_PORT_NAME_SIZE];
 
     size_t max_tx_data_size;
     size_t max_rx_data_size;
@@ -290,11 +293,12 @@
     el600x_data_frame_t *df_to_use = NULL;
 
 #if DEBUG
-    printk(KERN_INFO PFX "%s(data=%p, cflag=%x).\n", __func__, port, cflag);
+    printk(KERN_INFO PFX "%s(%s, cflag=%x).\n", __func__, port->name, cflag);
 #endif
 
     rtscts = cflag & CRTSCTS;
-    printk(KERN_INFO PFX "Requested RTS/CTS: %s.\n", rtscts ? "yes" : "no");
+    printk(KERN_INFO PFX "%s: Requested RTS/CTS: %s.\n",
+            port->name, rtscts ? "yes" : "no");
     
     cbaud = cflag & CBAUD;
 
@@ -308,10 +312,11 @@
     }
 
     if (b_to_use) {
-        printk(KERN_INFO PFX "Requested baud rate: %u.\n", b_to_use->baud);
+        printk(KERN_INFO PFX "%s: Requested baud rate: %u.\n",
+                port->name, b_to_use->baud);
     } else {
-        printk(KERN_ERR PFX "Error: Baud rate index %x not supported.\n",
-                cbaud);
+        printk(KERN_ERR PFX "Error: %s does not support"
+                " baud rate index %x.\n", port->name, cbaud);
         return -EINVAL;
     }
 
@@ -340,8 +345,8 @@
 
     stop_bits = (cflag & CSTOPB) ? 2 : 1;
 
-    printk(KERN_INFO PFX "Requested Data frame: %u%c%u.\n",
-            data_bits,
+    printk(KERN_INFO PFX "%s: Requested Data frame: %u%c%u.\n",
+            port->name, data_bits,
             (par == PAR_NONE ? 'N' : (par == PAR_ODD ? 'O' : 'E')),
             stop_bits);
 
@@ -357,7 +362,8 @@
     }
 
     if (!df_to_use) {
-        printk(KERN_ERR PFX "Error: Data frame type not supported.\n");
+        printk(KERN_ERR PFX "Error: %s does not support data frame type.\n",
+                port->name);
         return -EINVAL;
     }
 
@@ -371,13 +377,16 @@
 /****************************************************************************/
 
 int el60xx_port_init(el60xx_port_t *port, ec_slave_config_t *sc,
-        ec_domain_t *domain, unsigned int slot_offset)
+        ec_domain_t *domain, unsigned int slot_offset, const char *name)
 {
     int ret = 0;
 
+    strncpy(port->name, name, EL6002_PORT_NAME_SIZE);
+
     port->tty = ectty_create(el60xx_cflag_changed, port);
     if (IS_ERR(port->tty)) {
-        printk(KERN_ERR PFX "Failed to create tty.\n");
+        printk(KERN_ERR PFX "Failed to create tty for %s.\n",
+                port->name);
         ret = PTR_ERR(port->tty);
         goto out_return;
     }
@@ -404,21 +413,24 @@
 
     if (!(port->rtscts_sdo = ecrt_slave_config_create_sdo_request(sc,
                     0x8000 + slot_offset, 0x01, 1))) {
-        printk(KERN_ERR PFX "Failed to create SDO request.\n");
+        printk(KERN_ERR PFX "Failed to create SDO request for %s.\n",
+                port->name);
         ret = -ENOMEM;
         goto out_free_tty;
     }
 
     if (!(port->baud_sdo = ecrt_slave_config_create_sdo_request(sc,
                     0x8000 + slot_offset, 0x11, 1))) {
-        printk(KERN_ERR PFX "Failed to create SDO request.\n");
+        printk(KERN_ERR PFX "Failed to create SDO request for %s.\n",
+                port->name);
         ret = -ENOMEM;
         goto out_free_tty;
     }
 
     if (!(port->frame_sdo = ecrt_slave_config_create_sdo_request(sc,
                     0x8000 + slot_offset, 0x15, 1))) {
-        printk(KERN_ERR PFX "Failed to create SDO request.\n");
+        printk(KERN_ERR PFX "Failed to create SDO request for %s\n",
+                port->name);
         ret = -ENOMEM;
         goto out_free_tty;
     }
@@ -426,7 +438,8 @@
     ret = ecrt_slave_config_reg_pdo_entry(
             sc, 0x7001 + slot_offset, 0x01, domain, NULL);
     if (ret < 0) {
-        printk(KERN_ERR PFX "Failed to register PDO entry.\n");
+        printk(KERN_ERR PFX "Failed to register PDO entry of %s\n",
+                port->name);
         goto out_free_tty;
     }
     port->off_ctrl = ret;
@@ -434,7 +447,8 @@
     ret = ecrt_slave_config_reg_pdo_entry(
             sc, 0x7000 + slot_offset, 0x11, domain, NULL);
     if (ret < 0) {
-        printk(KERN_ERR PFX "Failed to register PDO entry.\n");
+        printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n",
+                port->name);
         goto out_free_tty;
     }
     port->off_tx = ret;
@@ -442,7 +456,8 @@
     ret = ecrt_slave_config_reg_pdo_entry(
             sc, 0x6001 + slot_offset, 0x01, domain, NULL);
     if (ret < 0) {
-        printk(KERN_ERR PFX "Failed to register PDO entry.\n");
+        printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n",
+                port->name);
         goto out_free_tty;
     }
     port->off_status = ret;
@@ -450,7 +465,8 @@
     ret = ecrt_slave_config_reg_pdo_entry(
             sc, 0x6000 + slot_offset, 0x11, domain, NULL);
     if (ret < 0) {
-        printk(KERN_ERR PFX "Failed to register PDO entry.\n");
+        printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n",
+                port->name);
         goto out_free_tty;
     }
     port->off_rx = ret;
@@ -458,6 +474,8 @@
     if (port->max_tx_data_size > 0) {
         port->tx_data = kmalloc(port->max_tx_data_size, GFP_KERNEL);
         if (port->tx_data == NULL) {
+            printk(KERN_ERR PFX "Failed to allocate %u bytes of TX"
+                    " memory for %s.\n", port->max_tx_data_size, port->name);
             ret = -ENOMEM;
             goto out_free_tty;
         }
@@ -530,7 +548,8 @@
                     ectty_tx_data(port->tty, port->tx_data, port->max_tx_data_size);
                 if (port->tx_data_size) {
 #if DEBUG
-                    printk(KERN_INFO PFX "Sending %u bytes.\n", port->tx_data_size);
+                    printk(KERN_INFO PFX "%s: Sending %u bytes.\n",
+                            port->name, port->tx_data_size);
 #endif
                     port->tx_request_toggle = !port->tx_request_toggle;
                     port->tx_accepted_toggle = tx_accepted_toggle;
@@ -544,7 +563,8 @@
                 uint8_t rx_data_size = status >> 8;
                 port->rx_request_toggle = rx_request_toggle;
 #if DEBUG
-                printk(KERN_INFO PFX "Received %u bytes.\n", rx_data_size);
+                printk(KERN_INFO PFX "%s: Received %u bytes.\n",
+                        port->name, rx_data_size);
 #endif
                 ectty_rx_data(port->tty, rx_data, rx_data_size);
                 port->rx_accepted_toggle = !port->rx_accepted_toggle;
@@ -567,7 +587,7 @@
 
         case SER_WAIT_FOR_INIT_RESPONSE:
             if (!(status & (1 << 2))) {
-                printk(KERN_INFO PFX "EL600x init successful.\n");
+                printk(KERN_INFO PFX "%s: Init successful.\n", port->name);
                 port->tx_accepted_toggle = 1;
                 port->control = 0x0000;
                 port->state = SER_READY;
@@ -577,12 +597,14 @@
         case SER_SET_RTSCTS:
             switch (ecrt_sdo_request_state(port->rtscts_sdo)) {
                 case EC_REQUEST_SUCCESS:
-                    printk(KERN_INFO PFX "Slave accepted RTS/CTS.\n");
+                    printk(KERN_INFO PFX "%s: Accepted RTS/CTS.\n",
+                            port->name);
                     port->current_rtscts = port->requested_rtscts;
                     port->state = SER_REQUEST_INIT;
                     break;
                 case EC_REQUEST_ERROR:
-                    printk(KERN_INFO PFX "Failed to set RTS/CTS!\n");
+                    printk(KERN_ERR PFX "Failed to set RTS/CTS on %s!\n",
+                            port->name);
                     port->state = SER_REQUEST_INIT;
                     port->config_error = 1;
                     break;
@@ -594,12 +616,14 @@
         case SER_SET_BAUD_RATE:
             switch (ecrt_sdo_request_state(port->baud_sdo)) {
                 case EC_REQUEST_SUCCESS:
-                    printk(KERN_INFO PFX "Slave accepted baud rate.\n");
+                    printk(KERN_INFO PFX "%s: Accepted baud rate.\n",
+                            port->name);
                     port->current_baud_rate = port->requested_baud_rate;
                     port->state = SER_REQUEST_INIT;
                     break;
                 case EC_REQUEST_ERROR:
-                    printk(KERN_INFO PFX "Failed to set baud rate!\n");
+                    printk(KERN_ERR PFX "Failed to set baud rate on %s!\n",
+                            port->name);
                     port->state = SER_REQUEST_INIT;
                     port->config_error = 1;
                     break;
@@ -611,12 +635,14 @@
         case SER_SET_DATA_FRAME:
             switch (ecrt_sdo_request_state(port->frame_sdo)) {
                 case EC_REQUEST_SUCCESS:
-                    printk(KERN_INFO PFX "Slave accepted data frame.\n");
+                    printk(KERN_INFO PFX "%s: Accepted data frame.\n",
+                            port->name);
                     port->current_data_frame = port->requested_data_frame;
                     port->state = SER_REQUEST_INIT;
                     break;
                 case EC_REQUEST_ERROR:
-                    printk(KERN_INFO PFX "Failed to set data frame!\n");
+                    printk(KERN_ERR PFX "Failed to set data frame on %s!\n",
+                            port->name);
                     port->state = SER_REQUEST_INIT;
                     port->config_error = 1;
                     break;
@@ -639,20 +665,27 @@
 
     if (!(el6002->sc = ecrt_master_slave_config(
                     master, 0, position, vendor, product))) {
-        printk(KERN_ERR PFX "Failed to create slave configuration.\n");
+        printk(KERN_ERR PFX "EL6002(%u): Failed to create"
+                " slave configuration.\n", position);
         ret = -EBUSY;
         goto out_return;
     }
 
     if (ecrt_slave_config_pdos(el6002->sc, EC_END, el6002_syncs)) {
-        printk(KERN_ERR PFX "Failed to configure PDOs.\n");
+        printk(KERN_ERR PFX "EL6002(%u): Failed to configure PDOs.\n",
+                position);
         ret = -ENOMEM;
         goto out_return;
     }
 
     for (i = 0; i < EL6002_PORTS; i++) {
-        if (el60xx_port_init(el6002->port + i, el6002->sc, domain, i * 0x10)) {
-            printk(KERN_ERR PFX "Failed to init port X%u.\n", i);
+        char name[EL6002_PORT_NAME_SIZE];
+        snprintf(name, EL6002_PORT_NAME_SIZE, "EL6002(%u) X%u",
+                position, i + 1);
+        if (el60xx_port_init(el6002->port + i, el6002->sc, domain, i * 0x10,
+                    name)) {
+            printk(KERN_ERR PFX "EL6002(%u): Failed to init port X%u.\n",
+                    position, i);
             goto out_ports;
         }
     }
@@ -719,7 +752,6 @@
 
     ret = el6002_init(el6002, master, position, domain, vendor, product);
     if (ret) {
-        printk(KERN_ERR PFX "Failed to init serial device object.\n");
         kfree(el6002);
         return ret;
     }
@@ -769,7 +801,7 @@
         }
     }
 
-    printk(KERN_INFO PFX "Finished.\n");
+    printk(KERN_INFO PFX "Finished registering serial devices.\n");
     return 0;
 
 out_free_handlers: