|
@@ -2,7 +2,7 @@
|
|
|
* nozomi.c -- HSDPA driver Broadband Wireless Data Card - Globe Trotter
|
|
|
*
|
|
|
* Written by: Ulf Jakobsson,
|
|
|
- * Jan �erfeldt,
|
|
|
+ * Jan Åkerfeldt,
|
|
|
* Stefan Thomasson,
|
|
|
*
|
|
|
* Maintained by: Paul Hardwick (p.hardwick@option.com)
|
|
@@ -38,60 +38,6 @@
|
|
|
* --------------------------------------------------------------------------
|
|
|
*/
|
|
|
|
|
|
-/*
|
|
|
- * CHANGELOG
|
|
|
- * Version 2.1d
|
|
|
- * 11-November-2007 Jiri Slaby, Frank Seidel
|
|
|
- * - Big rework of multicard support by Jiri
|
|
|
- * - Major cleanups (semaphore to mutex, endianess, no major reservation)
|
|
|
- * - Optimizations
|
|
|
- *
|
|
|
- * Version 2.1c
|
|
|
- * 30-October-2007 Frank Seidel
|
|
|
- * - Completed multicard support
|
|
|
- * - Minor cleanups
|
|
|
- *
|
|
|
- * Version 2.1b
|
|
|
- * 07-August-2007 Frank Seidel
|
|
|
- * - Minor cleanups
|
|
|
- * - theoretical multicard support
|
|
|
- *
|
|
|
- * Version 2.1
|
|
|
- * 03-July-2006 Paul Hardwick
|
|
|
- *
|
|
|
- * - Stability Improvements. Incorporated spinlock wraps patch.
|
|
|
- * - Updated for newer 2.6.14+ kernels (tty_buffer_request_room)
|
|
|
- * - using __devexit macro for tty
|
|
|
- *
|
|
|
- *
|
|
|
- * Version 2.0
|
|
|
- * 08-feb-2006 15:34:10:Ulf
|
|
|
- *
|
|
|
- * -Fixed issue when not waking up line disipine layer, could probably result
|
|
|
- * in better uplink performance for 2.4.
|
|
|
- *
|
|
|
- * -Fixed issue with big endian during initalization, now proper toggle flags
|
|
|
- * are handled between preloader and maincode.
|
|
|
- *
|
|
|
- * -Fixed flow control issue.
|
|
|
- *
|
|
|
- * -Added support for setting DTR.
|
|
|
- *
|
|
|
- * -For 2.4 kernels, removing temporary buffer that's not needed.
|
|
|
- *
|
|
|
- * -Reading CTS only for modem port (only port that supports it).
|
|
|
- *
|
|
|
- * -Return 0 in write_room instead of netative value, it's not handled in
|
|
|
- * upper layer.
|
|
|
- *
|
|
|
- * --------------------------------------------------------------------------
|
|
|
- * Version 1.0
|
|
|
- *
|
|
|
- * First version of driver, only tested with card of type F32_2.
|
|
|
- * Works fine with 2.4 and 2.6 kernels.
|
|
|
- * Driver also support big endian architecture.
|
|
|
- */
|
|
|
-
|
|
|
/* Enable this to have a lot of debug printouts */
|
|
|
#define DEBUG
|
|
|
|
|
@@ -143,8 +89,9 @@ do { \
|
|
|
/* Do we need this settable at runtime? */
|
|
|
static int debug = NOZOMI_DEBUG_LEVEL;
|
|
|
|
|
|
-#define D(lvl, args...) do {if (lvl & debug) NFO(KERN_DEBUG, ##args); } \
|
|
|
- while (0)
|
|
|
+#define D(lvl, args...) do \
|
|
|
+ {if (lvl & debug) NFO(KERN_DEBUG, ##args); } \
|
|
|
+ while (0)
|
|
|
#define D_(lvl, args...) D(lvl, ##args)
|
|
|
|
|
|
/* These printouts are always printed */
|
|
@@ -273,13 +220,13 @@ enum port_type {
|
|
|
/* Big endian */
|
|
|
|
|
|
struct toggles {
|
|
|
- unsigned enabled:5; /*
|
|
|
+ unsigned int enabled:5; /*
|
|
|
* Toggle fields are valid if enabled is 0,
|
|
|
* else A-channels must always be used.
|
|
|
*/
|
|
|
- unsigned diag_dl:1;
|
|
|
- unsigned mdm_dl:1;
|
|
|
- unsigned mdm_ul:1;
|
|
|
+ unsigned int diag_dl:1;
|
|
|
+ unsigned int mdm_dl:1;
|
|
|
+ unsigned int mdm_ul:1;
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
|
/* Configuration table to read at startup of card */
|
|
@@ -320,19 +267,19 @@ struct config_table {
|
|
|
/* This stores all control downlink flags */
|
|
|
struct ctrl_dl {
|
|
|
u8 port;
|
|
|
- unsigned reserved:4;
|
|
|
- unsigned CTS:1;
|
|
|
- unsigned RI:1;
|
|
|
- unsigned DCD:1;
|
|
|
- unsigned DSR:1;
|
|
|
+ unsigned int reserved:4;
|
|
|
+ unsigned int CTS:1;
|
|
|
+ unsigned int RI:1;
|
|
|
+ unsigned int DCD:1;
|
|
|
+ unsigned int DSR:1;
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
|
/* This stores all control uplink flags */
|
|
|
struct ctrl_ul {
|
|
|
u8 port;
|
|
|
- unsigned reserved:6;
|
|
|
- unsigned RTS:1;
|
|
|
- unsigned DTR:1;
|
|
|
+ unsigned int reserved:6;
|
|
|
+ unsigned int RTS:1;
|
|
|
+ unsigned int DTR:1;
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
|
#else
|
|
@@ -340,10 +287,10 @@ struct ctrl_ul {
|
|
|
|
|
|
/* This represents the toggle information */
|
|
|
struct toggles {
|
|
|
- unsigned mdm_ul:1;
|
|
|
- unsigned mdm_dl:1;
|
|
|
- unsigned diag_dl:1;
|
|
|
- unsigned enabled:5; /*
|
|
|
+ unsigned int mdm_ul:1;
|
|
|
+ unsigned int mdm_dl:1;
|
|
|
+ unsigned int diag_dl:1;
|
|
|
+ unsigned int enabled:5; /*
|
|
|
* Toggle fields are valid if enabled is 0,
|
|
|
* else A-channels must always be used.
|
|
|
*/
|
|
@@ -379,19 +326,19 @@ struct config_table {
|
|
|
|
|
|
/* This stores all control downlink flags */
|
|
|
struct ctrl_dl {
|
|
|
- unsigned DSR:1;
|
|
|
- unsigned DCD:1;
|
|
|
- unsigned RI:1;
|
|
|
- unsigned CTS:1;
|
|
|
- unsigned reserverd:4;
|
|
|
+ unsigned int DSR:1;
|
|
|
+ unsigned int DCD:1;
|
|
|
+ unsigned int RI:1;
|
|
|
+ unsigned int CTS:1;
|
|
|
+ unsigned int reserverd:4;
|
|
|
u8 port;
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
|
/* This stores all control uplink flags */
|
|
|
struct ctrl_ul {
|
|
|
- unsigned DTR:1;
|
|
|
- unsigned RTS:1;
|
|
|
- unsigned reserved:6;
|
|
|
+ unsigned int DTR:1;
|
|
|
+ unsigned int RTS:1;
|
|
|
+ unsigned int reserved:6;
|
|
|
u8 port;
|
|
|
} __attribute__ ((packed));
|
|
|
#endif
|
|
@@ -694,7 +641,7 @@ static void dump_table(const struct nozomi *dc)
|
|
|
dc->config_table.ul_ctrl_len);
|
|
|
}
|
|
|
#else
|
|
|
-static __inline__ void dump_table(const struct nozomi *dc) { }
|
|
|
+static inline void dump_table(const struct nozomi *dc) { }
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
@@ -1102,7 +1049,7 @@ static int send_flow_control(struct nozomi *dc)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Handle donlink data, ports that are handled are modem and diagnostics
|
|
|
+ * Handle downlink data, ports that are handled are modem and diagnostics
|
|
|
* Return 1 - ok
|
|
|
* Return 0 - toggle fields are out of sync
|
|
|
*/
|
|
@@ -1363,7 +1310,7 @@ static ssize_t card_type_show(struct device *dev, struct device_attribute *attr,
|
|
|
|
|
|
return sprintf(buf, "%d\n", dc->card_type);
|
|
|
}
|
|
|
-static DEVICE_ATTR(card_type, 0444, card_type_show, NULL);
|
|
|
+static DEVICE_ATTR(card_type, S_IRUGO, card_type_show, NULL);
|
|
|
|
|
|
static ssize_t open_ttys_show(struct device *dev, struct device_attribute *attr,
|
|
|
char *buf)
|
|
@@ -1372,7 +1319,7 @@ static ssize_t open_ttys_show(struct device *dev, struct device_attribute *attr,
|
|
|
|
|
|
return sprintf(buf, "%u\n", dc->open_ttys);
|
|
|
}
|
|
|
-static DEVICE_ATTR(open_ttys, 0444, open_ttys_show, NULL);
|
|
|
+static DEVICE_ATTR(open_ttys, S_IRUGO, open_ttys_show, NULL);
|
|
|
|
|
|
static void make_sysfs_files(struct nozomi *dc)
|
|
|
{
|
|
@@ -1882,7 +1829,10 @@ static void ntty_throttle(struct tty_struct *tty)
|
|
|
/* just to discard single character writes */
|
|
|
static void ntty_put_char(struct tty_struct *tty, unsigned char c)
|
|
|
{
|
|
|
- /* FIXME !!! */
|
|
|
+ /*
|
|
|
+ * card does not react correct when we write single chars
|
|
|
+ * to the card, so we discard them
|
|
|
+ */
|
|
|
DBG2("PUT CHAR Function: %c", c);
|
|
|
}
|
|
|
|