Automatic merge of /spare/repo/netdev-2.6 branch orinoco-hch
This commit is contained in:
commit
4d8e11dcc2
|
@ -492,6 +492,9 @@ EXPORT_SYMBOL(orinoco_debug);
|
||||||
static int suppress_linkstatus; /* = 0 */
|
static int suppress_linkstatus; /* = 0 */
|
||||||
module_param(suppress_linkstatus, bool, 0644);
|
module_param(suppress_linkstatus, bool, 0644);
|
||||||
MODULE_PARM_DESC(suppress_linkstatus, "Don't log link status changes");
|
MODULE_PARM_DESC(suppress_linkstatus, "Don't log link status changes");
|
||||||
|
static int ignore_disconnect; /* = 0 */
|
||||||
|
module_param(ignore_disconnect, int, 0644);
|
||||||
|
MODULE_PARM_DESC(ignore_disconnect, "Don't report lost link to the network layer");
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
/* Compile time configuration and compatibility stuff */
|
/* Compile time configuration and compatibility stuff */
|
||||||
|
@ -604,7 +607,6 @@ struct hermes_rx_descriptor {
|
||||||
static int orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
static int orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
||||||
static int __orinoco_program_rids(struct net_device *dev);
|
static int __orinoco_program_rids(struct net_device *dev);
|
||||||
static void __orinoco_set_multicast_list(struct net_device *dev);
|
static void __orinoco_set_multicast_list(struct net_device *dev);
|
||||||
static int orinoco_debug_dump_recs(struct net_device *dev);
|
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
/* Internal helper functions */
|
/* Internal helper functions */
|
||||||
|
@ -655,7 +657,7 @@ static int orinoco_open(struct net_device *dev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int orinoco_stop(struct net_device *dev)
|
static int orinoco_stop(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct orinoco_private *priv = netdev_priv(dev);
|
struct orinoco_private *priv = netdev_priv(dev);
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -686,7 +688,7 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
|
||||||
struct orinoco_private *priv = netdev_priv(dev);
|
struct orinoco_private *priv = netdev_priv(dev);
|
||||||
hermes_t *hw = &priv->hw;
|
hermes_t *hw = &priv->hw;
|
||||||
struct iw_statistics *wstats = &priv->wstats;
|
struct iw_statistics *wstats = &priv->wstats;
|
||||||
int err = 0;
|
int err;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (! netif_device_present(dev)) {
|
if (! netif_device_present(dev)) {
|
||||||
|
@ -695,9 +697,21 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
|
||||||
return NULL; /* FIXME: Can we do better than this? */
|
return NULL; /* FIXME: Can we do better than this? */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If busy, return the old stats. Returning NULL may cause
|
||||||
|
* the interface to disappear from /proc/net/wireless */
|
||||||
if (orinoco_lock(priv, &flags) != 0)
|
if (orinoco_lock(priv, &flags) != 0)
|
||||||
return NULL; /* FIXME: Erg, we've been signalled, how
|
return wstats;
|
||||||
* do we propagate this back up? */
|
|
||||||
|
/* We can't really wait for the tallies inquiry command to
|
||||||
|
* complete, so we just use the previous results and trigger
|
||||||
|
* a new tallies inquiry command for next time - Jean II */
|
||||||
|
/* FIXME: Really we should wait for the inquiry to come back -
|
||||||
|
* as it is the stats we give don't make a whole lot of sense.
|
||||||
|
* Unfortunately, it's not clear how to do that within the
|
||||||
|
* wireless extensions framework: I think we're in user
|
||||||
|
* context, but a lock seems to be held by the time we get in
|
||||||
|
* here so we're not safe to sleep here. */
|
||||||
|
hermes_inquire(hw, HERMES_INQ_TALLIES);
|
||||||
|
|
||||||
if (priv->iw_mode == IW_MODE_ADHOC) {
|
if (priv->iw_mode == IW_MODE_ADHOC) {
|
||||||
memset(&wstats->qual, 0, sizeof(wstats->qual));
|
memset(&wstats->qual, 0, sizeof(wstats->qual));
|
||||||
|
@ -716,25 +730,16 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
|
||||||
|
|
||||||
err = HERMES_READ_RECORD(hw, USER_BAP,
|
err = HERMES_READ_RECORD(hw, USER_BAP,
|
||||||
HERMES_RID_COMMSQUALITY, &cq);
|
HERMES_RID_COMMSQUALITY, &cq);
|
||||||
|
|
||||||
wstats->qual.qual = (int)le16_to_cpu(cq.qual);
|
if (!err) {
|
||||||
wstats->qual.level = (int)le16_to_cpu(cq.signal) - 0x95;
|
wstats->qual.qual = (int)le16_to_cpu(cq.qual);
|
||||||
wstats->qual.noise = (int)le16_to_cpu(cq.noise) - 0x95;
|
wstats->qual.level = (int)le16_to_cpu(cq.signal) - 0x95;
|
||||||
wstats->qual.updated = 7;
|
wstats->qual.noise = (int)le16_to_cpu(cq.noise) - 0x95;
|
||||||
|
wstats->qual.updated = 7;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can't really wait for the tallies inquiry command to
|
|
||||||
* complete, so we just use the previous results and trigger
|
|
||||||
* a new tallies inquiry command for next time - Jean II */
|
|
||||||
/* FIXME: We're in user context (I think?), so we should just
|
|
||||||
wait for the tallies to come through */
|
|
||||||
err = hermes_inquire(hw, HERMES_INQ_TALLIES);
|
|
||||||
|
|
||||||
orinoco_unlock(priv, &flags);
|
orinoco_unlock(priv, &flags);
|
||||||
|
|
||||||
if (err)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return wstats;
|
return wstats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1275,9 +1280,10 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
|
||||||
len = sizeof(tallies);
|
len = sizeof(tallies);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read directly the data (no seek) */
|
err = hermes_bap_pread(hw, IRQ_BAP, &tallies, len,
|
||||||
hermes_read_words(hw, HERMES_DATA1, (void *) &tallies,
|
infofid, sizeof(info));
|
||||||
len / 2); /* FIXME: blech! */
|
if (err)
|
||||||
|
break;
|
||||||
|
|
||||||
/* Increment our various counters */
|
/* Increment our various counters */
|
||||||
/* wstats->discard.nwid - no wrong BSSID stuff */
|
/* wstats->discard.nwid - no wrong BSSID stuff */
|
||||||
|
@ -1307,8 +1313,10 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
hermes_read_words(hw, HERMES_DATA1, (void *) &linkstatus,
|
err = hermes_bap_pread(hw, IRQ_BAP, &linkstatus, len,
|
||||||
len / 2);
|
infofid, sizeof(info));
|
||||||
|
if (err)
|
||||||
|
break;
|
||||||
newstatus = le16_to_cpu(linkstatus.linkstatus);
|
newstatus = le16_to_cpu(linkstatus.linkstatus);
|
||||||
|
|
||||||
connected = (newstatus == HERMES_LINKSTATUS_CONNECTED)
|
connected = (newstatus == HERMES_LINKSTATUS_CONNECTED)
|
||||||
|
@ -1317,7 +1325,7 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
|
||||||
|
|
||||||
if (connected)
|
if (connected)
|
||||||
netif_carrier_on(dev);
|
netif_carrier_on(dev);
|
||||||
else
|
else if (!ignore_disconnect)
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
|
|
||||||
if (newstatus != priv->last_linkstatus)
|
if (newstatus != priv->last_linkstatus)
|
||||||
|
@ -1350,6 +1358,8 @@ int __orinoco_up(struct net_device *dev)
|
||||||
struct hermes *hw = &priv->hw;
|
struct hermes *hw = &priv->hw;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
netif_carrier_off(dev); /* just to make sure */
|
||||||
|
|
||||||
err = __orinoco_program_rids(dev);
|
err = __orinoco_program_rids(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "%s: Error %d configuring card\n",
|
printk(KERN_ERR "%s: Error %d configuring card\n",
|
||||||
|
@ -1413,7 +1423,7 @@ int orinoco_reinit_firmware(struct net_device *dev)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
|
err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
|
||||||
if (err == -EIO) {
|
if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) {
|
||||||
/* Try workaround for old Symbol firmware bug */
|
/* Try workaround for old Symbol firmware bug */
|
||||||
printk(KERN_WARNING "%s: firmware ALLOC bug detected "
|
printk(KERN_WARNING "%s: firmware ALLOC bug detected "
|
||||||
"(old Symbol firmware?). Trying to work around... ",
|
"(old Symbol firmware?). Trying to work around... ",
|
||||||
|
@ -1610,17 +1620,15 @@ static int __orinoco_program_rids(struct net_device *dev)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
/* Set the channel/frequency */
|
/* Set the channel/frequency */
|
||||||
if (priv->channel == 0) {
|
if (priv->channel != 0 && priv->iw_mode != IW_MODE_INFRA) {
|
||||||
printk(KERN_DEBUG "%s: Channel is 0 in __orinoco_program_rids()\n", dev->name);
|
err = hermes_write_wordrec(hw, USER_BAP,
|
||||||
if (priv->createibss)
|
HERMES_RID_CNFOWNCHANNEL,
|
||||||
priv->channel = 10;
|
priv->channel);
|
||||||
}
|
if (err) {
|
||||||
err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNFOWNCHANNEL,
|
printk(KERN_ERR "%s: Error %d setting channel %d\n",
|
||||||
priv->channel);
|
dev->name, err, priv->channel);
|
||||||
if (err) {
|
return err;
|
||||||
printk(KERN_ERR "%s: Error %d setting channel\n",
|
}
|
||||||
dev->name, err);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->has_ibss) {
|
if (priv->has_ibss) {
|
||||||
|
@ -1916,7 +1924,7 @@ static void orinoco_reset(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct orinoco_private *priv = netdev_priv(dev);
|
struct orinoco_private *priv = netdev_priv(dev);
|
||||||
struct hermes *hw = &priv->hw;
|
struct hermes *hw = &priv->hw;
|
||||||
int err = 0;
|
int err;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (orinoco_lock(priv, &flags) != 0)
|
if (orinoco_lock(priv, &flags) != 0)
|
||||||
|
@ -1938,20 +1946,20 @@ static void orinoco_reset(struct net_device *dev)
|
||||||
|
|
||||||
orinoco_unlock(priv, &flags);
|
orinoco_unlock(priv, &flags);
|
||||||
|
|
||||||
if (priv->hard_reset)
|
if (priv->hard_reset) {
|
||||||
err = (*priv->hard_reset)(priv);
|
err = (*priv->hard_reset)(priv);
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "%s: orinoco_reset: Error %d "
|
printk(KERN_ERR "%s: orinoco_reset: Error %d "
|
||||||
"performing hard reset\n", dev->name, err);
|
"performing hard reset\n", dev->name, err);
|
||||||
/* FIXME: shutdown of some sort */
|
goto disable;
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = orinoco_reinit_firmware(dev);
|
err = orinoco_reinit_firmware(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "%s: orinoco_reset: Error %d re-initializing firmware\n",
|
printk(KERN_ERR "%s: orinoco_reset: Error %d re-initializing firmware\n",
|
||||||
dev->name, err);
|
dev->name, err);
|
||||||
return;
|
goto disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irq(&priv->lock); /* This has to be called from user context */
|
spin_lock_irq(&priv->lock); /* This has to be called from user context */
|
||||||
|
@ -1972,6 +1980,10 @@ static void orinoco_reset(struct net_device *dev)
|
||||||
spin_unlock_irq(&priv->lock);
|
spin_unlock_irq(&priv->lock);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
disable:
|
||||||
|
hermes_set_irqmask(hw, 0);
|
||||||
|
netif_device_detach(dev);
|
||||||
|
printk(KERN_ERR "%s: Device has been disabled!\n", dev->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
|
@ -2056,7 +2068,7 @@ irqreturn_t orinoco_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
if (events & HERMES_EV_ALLOC)
|
if (events & HERMES_EV_ALLOC)
|
||||||
__orinoco_ev_alloc(dev, hw);
|
__orinoco_ev_alloc(dev, hw);
|
||||||
|
|
||||||
hermes_write_regn(hw, EVACK, events);
|
hermes_write_regn(hw, EVACK, evstat);
|
||||||
|
|
||||||
evstat = hermes_read_regn(hw, EVSTAT);
|
evstat = hermes_read_regn(hw, EVSTAT);
|
||||||
events = evstat & hw->inten;
|
events = evstat & hw->inten;
|
||||||
|
@ -2215,6 +2227,8 @@ static int determine_firmware(struct net_device *dev)
|
||||||
firmver >= 0x31000;
|
firmver >= 0x31000;
|
||||||
priv->has_preamble = (firmver >= 0x20000);
|
priv->has_preamble = (firmver >= 0x20000);
|
||||||
priv->ibss_port = 4;
|
priv->ibss_port = 4;
|
||||||
|
priv->broken_disableport = (firmver == 0x25013) ||
|
||||||
|
(firmver >= 0x30000 && firmver <= 0x31000);
|
||||||
/* Tested with Intel firmware : 0x20015 => Jean II */
|
/* Tested with Intel firmware : 0x20015 => Jean II */
|
||||||
/* Tested with 3Com firmware : 0x15012 & 0x22001 => Jean II */
|
/* Tested with 3Com firmware : 0x15012 & 0x22001 => Jean II */
|
||||||
break;
|
break;
|
||||||
|
@ -2267,7 +2281,7 @@ static int orinoco_init(struct net_device *dev)
|
||||||
priv->nicbuf_size = IEEE802_11_FRAME_LEN + ETH_HLEN;
|
priv->nicbuf_size = IEEE802_11_FRAME_LEN + ETH_HLEN;
|
||||||
|
|
||||||
/* Initialize the firmware */
|
/* Initialize the firmware */
|
||||||
err = hermes_init(hw);
|
err = orinoco_reinit_firmware(dev);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n",
|
printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n",
|
||||||
dev->name, err);
|
dev->name, err);
|
||||||
|
@ -2400,31 +2414,12 @@ static int orinoco_init(struct net_device *dev)
|
||||||
/* By default use IEEE/IBSS ad-hoc mode if we have it */
|
/* By default use IEEE/IBSS ad-hoc mode if we have it */
|
||||||
priv->prefer_port3 = priv->has_port3 && (! priv->has_ibss);
|
priv->prefer_port3 = priv->has_port3 && (! priv->has_ibss);
|
||||||
set_port_type(priv);
|
set_port_type(priv);
|
||||||
priv->channel = 10; /* default channel, more-or-less arbitrary */
|
priv->channel = 0; /* use firmware default */
|
||||||
|
|
||||||
priv->promiscuous = 0;
|
priv->promiscuous = 0;
|
||||||
priv->wep_on = 0;
|
priv->wep_on = 0;
|
||||||
priv->tx_key = 0;
|
priv->tx_key = 0;
|
||||||
|
|
||||||
err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
|
|
||||||
if (err == -EIO) {
|
|
||||||
/* Try workaround for old Symbol firmware bug */
|
|
||||||
printk(KERN_WARNING "%s: firmware ALLOC bug detected "
|
|
||||||
"(old Symbol firmware?). Trying to work around... ",
|
|
||||||
dev->name);
|
|
||||||
|
|
||||||
priv->nicbuf_size = TX_NICBUF_SIZE_BUG;
|
|
||||||
err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
|
|
||||||
if (err)
|
|
||||||
printk("failed!\n");
|
|
||||||
else
|
|
||||||
printk("ok.\n");
|
|
||||||
}
|
|
||||||
if (err) {
|
|
||||||
printk("%s: Error %d allocating Tx buffer\n", dev->name, err);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make the hardware available, as long as it hasn't been
|
/* Make the hardware available, as long as it hasn't been
|
||||||
* removed elsewhere (e.g. by PCMCIA hot unplug) */
|
* removed elsewhere (e.g. by PCMCIA hot unplug) */
|
||||||
spin_lock_irq(&priv->lock);
|
spin_lock_irq(&priv->lock);
|
||||||
|
@ -2450,7 +2445,7 @@ struct net_device *alloc_orinocodev(int sizeof_card,
|
||||||
priv = netdev_priv(dev);
|
priv = netdev_priv(dev);
|
||||||
priv->ndev = dev;
|
priv->ndev = dev;
|
||||||
if (sizeof_card)
|
if (sizeof_card)
|
||||||
priv->card = (void *)((unsigned long)netdev_priv(dev)
|
priv->card = (void *)((unsigned long)priv
|
||||||
+ sizeof(struct orinoco_private));
|
+ sizeof(struct orinoco_private));
|
||||||
else
|
else
|
||||||
priv->card = NULL;
|
priv->card = NULL;
|
||||||
|
@ -2555,6 +2550,7 @@ static int orinoco_hw_get_essid(struct orinoco_private *priv, int *active,
|
||||||
}
|
}
|
||||||
|
|
||||||
len = le16_to_cpu(essidbuf.len);
|
len = le16_to_cpu(essidbuf.len);
|
||||||
|
BUG_ON(len > IW_ESSID_MAX_SIZE);
|
||||||
|
|
||||||
memset(buf, 0, IW_ESSID_MAX_SIZE+1);
|
memset(buf, 0, IW_ESSID_MAX_SIZE+1);
|
||||||
memcpy(buf, p, len);
|
memcpy(buf, p, len);
|
||||||
|
@ -2923,13 +2919,14 @@ static int orinoco_ioctl_setessid(struct net_device *dev, struct iw_point *erq)
|
||||||
memset(&essidbuf, 0, sizeof(essidbuf));
|
memset(&essidbuf, 0, sizeof(essidbuf));
|
||||||
|
|
||||||
if (erq->flags) {
|
if (erq->flags) {
|
||||||
if (erq->length > IW_ESSID_MAX_SIZE)
|
/* iwconfig includes the NUL in the specified length */
|
||||||
|
if (erq->length > IW_ESSID_MAX_SIZE+1)
|
||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
|
|
||||||
if (copy_from_user(&essidbuf, erq->pointer, erq->length))
|
if (copy_from_user(&essidbuf, erq->pointer, erq->length))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
essidbuf[erq->length] = '\0';
|
essidbuf[IW_ESSID_MAX_SIZE] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (orinoco_lock(priv, &flags) != 0)
|
if (orinoco_lock(priv, &flags) != 0)
|
||||||
|
@ -3855,7 +3852,6 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||||
{ SIOCIWFIRSTPRIV + 0x7, 0,
|
{ SIOCIWFIRSTPRIV + 0x7, 0,
|
||||||
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
|
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
|
||||||
"get_ibssport" },
|
"get_ibssport" },
|
||||||
{ SIOCIWLASTPRIV, 0, 0, "dump_recs" },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]);
|
wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]);
|
||||||
|
@ -3943,14 +3939,6 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||||
err = orinoco_ioctl_getibssport(dev, wrq);
|
err = orinoco_ioctl_getibssport(dev, wrq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCIWLASTPRIV:
|
|
||||||
err = orinoco_debug_dump_recs(dev);
|
|
||||||
if (err)
|
|
||||||
printk(KERN_ERR "%s: Unable to dump records (%d)\n",
|
|
||||||
dev->name, err);
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
@ -3964,187 +3952,6 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct {
|
|
||||||
u16 rid;
|
|
||||||
char *name;
|
|
||||||
int displaytype;
|
|
||||||
#define DISPLAY_WORDS 0
|
|
||||||
#define DISPLAY_BYTES 1
|
|
||||||
#define DISPLAY_STRING 2
|
|
||||||
#define DISPLAY_XSTRING 3
|
|
||||||
} record_table[] = {
|
|
||||||
#define DEBUG_REC(name,type) { HERMES_RID_##name, #name, DISPLAY_##type }
|
|
||||||
DEBUG_REC(CNFPORTTYPE,WORDS),
|
|
||||||
DEBUG_REC(CNFOWNMACADDR,BYTES),
|
|
||||||
DEBUG_REC(CNFDESIREDSSID,STRING),
|
|
||||||
DEBUG_REC(CNFOWNCHANNEL,WORDS),
|
|
||||||
DEBUG_REC(CNFOWNSSID,STRING),
|
|
||||||
DEBUG_REC(CNFOWNATIMWINDOW,WORDS),
|
|
||||||
DEBUG_REC(CNFSYSTEMSCALE,WORDS),
|
|
||||||
DEBUG_REC(CNFMAXDATALEN,WORDS),
|
|
||||||
DEBUG_REC(CNFPMENABLED,WORDS),
|
|
||||||
DEBUG_REC(CNFPMEPS,WORDS),
|
|
||||||
DEBUG_REC(CNFMULTICASTRECEIVE,WORDS),
|
|
||||||
DEBUG_REC(CNFMAXSLEEPDURATION,WORDS),
|
|
||||||
DEBUG_REC(CNFPMHOLDOVERDURATION,WORDS),
|
|
||||||
DEBUG_REC(CNFOWNNAME,STRING),
|
|
||||||
DEBUG_REC(CNFOWNDTIMPERIOD,WORDS),
|
|
||||||
DEBUG_REC(CNFMULTICASTPMBUFFERING,WORDS),
|
|
||||||
DEBUG_REC(CNFWEPENABLED_AGERE,WORDS),
|
|
||||||
DEBUG_REC(CNFMANDATORYBSSID_SYMBOL,WORDS),
|
|
||||||
DEBUG_REC(CNFWEPDEFAULTKEYID,WORDS),
|
|
||||||
DEBUG_REC(CNFDEFAULTKEY0,BYTES),
|
|
||||||
DEBUG_REC(CNFDEFAULTKEY1,BYTES),
|
|
||||||
DEBUG_REC(CNFMWOROBUST_AGERE,WORDS),
|
|
||||||
DEBUG_REC(CNFDEFAULTKEY2,BYTES),
|
|
||||||
DEBUG_REC(CNFDEFAULTKEY3,BYTES),
|
|
||||||
DEBUG_REC(CNFWEPFLAGS_INTERSIL,WORDS),
|
|
||||||
DEBUG_REC(CNFWEPKEYMAPPINGTABLE,WORDS),
|
|
||||||
DEBUG_REC(CNFAUTHENTICATION,WORDS),
|
|
||||||
DEBUG_REC(CNFMAXASSOCSTA,WORDS),
|
|
||||||
DEBUG_REC(CNFKEYLENGTH_SYMBOL,WORDS),
|
|
||||||
DEBUG_REC(CNFTXCONTROL,WORDS),
|
|
||||||
DEBUG_REC(CNFROAMINGMODE,WORDS),
|
|
||||||
DEBUG_REC(CNFHOSTAUTHENTICATION,WORDS),
|
|
||||||
DEBUG_REC(CNFRCVCRCERROR,WORDS),
|
|
||||||
DEBUG_REC(CNFMMLIFE,WORDS),
|
|
||||||
DEBUG_REC(CNFALTRETRYCOUNT,WORDS),
|
|
||||||
DEBUG_REC(CNFBEACONINT,WORDS),
|
|
||||||
DEBUG_REC(CNFAPPCFINFO,WORDS),
|
|
||||||
DEBUG_REC(CNFSTAPCFINFO,WORDS),
|
|
||||||
DEBUG_REC(CNFPRIORITYQUSAGE,WORDS),
|
|
||||||
DEBUG_REC(CNFTIMCTRL,WORDS),
|
|
||||||
DEBUG_REC(CNFTHIRTY2TALLY,WORDS),
|
|
||||||
DEBUG_REC(CNFENHSECURITY,WORDS),
|
|
||||||
DEBUG_REC(CNFGROUPADDRESSES,BYTES),
|
|
||||||
DEBUG_REC(CNFCREATEIBSS,WORDS),
|
|
||||||
DEBUG_REC(CNFFRAGMENTATIONTHRESHOLD,WORDS),
|
|
||||||
DEBUG_REC(CNFRTSTHRESHOLD,WORDS),
|
|
||||||
DEBUG_REC(CNFTXRATECONTROL,WORDS),
|
|
||||||
DEBUG_REC(CNFPROMISCUOUSMODE,WORDS),
|
|
||||||
DEBUG_REC(CNFBASICRATES_SYMBOL,WORDS),
|
|
||||||
DEBUG_REC(CNFPREAMBLE_SYMBOL,WORDS),
|
|
||||||
DEBUG_REC(CNFSHORTPREAMBLE,WORDS),
|
|
||||||
DEBUG_REC(CNFWEPKEYS_AGERE,BYTES),
|
|
||||||
DEBUG_REC(CNFEXCLUDELONGPREAMBLE,WORDS),
|
|
||||||
DEBUG_REC(CNFTXKEY_AGERE,WORDS),
|
|
||||||
DEBUG_REC(CNFAUTHENTICATIONRSPTO,WORDS),
|
|
||||||
DEBUG_REC(CNFBASICRATES,WORDS),
|
|
||||||
DEBUG_REC(CNFSUPPORTEDRATES,WORDS),
|
|
||||||
DEBUG_REC(CNFTICKTIME,WORDS),
|
|
||||||
DEBUG_REC(CNFSCANREQUEST,WORDS),
|
|
||||||
DEBUG_REC(CNFJOINREQUEST,WORDS),
|
|
||||||
DEBUG_REC(CNFAUTHENTICATESTATION,WORDS),
|
|
||||||
DEBUG_REC(CNFCHANNELINFOREQUEST,WORDS),
|
|
||||||
DEBUG_REC(MAXLOADTIME,WORDS),
|
|
||||||
DEBUG_REC(DOWNLOADBUFFER,WORDS),
|
|
||||||
DEBUG_REC(PRIID,WORDS),
|
|
||||||
DEBUG_REC(PRISUPRANGE,WORDS),
|
|
||||||
DEBUG_REC(CFIACTRANGES,WORDS),
|
|
||||||
DEBUG_REC(NICSERNUM,XSTRING),
|
|
||||||
DEBUG_REC(NICID,WORDS),
|
|
||||||
DEBUG_REC(MFISUPRANGE,WORDS),
|
|
||||||
DEBUG_REC(CFISUPRANGE,WORDS),
|
|
||||||
DEBUG_REC(CHANNELLIST,WORDS),
|
|
||||||
DEBUG_REC(REGULATORYDOMAINS,WORDS),
|
|
||||||
DEBUG_REC(TEMPTYPE,WORDS),
|
|
||||||
/* DEBUG_REC(CIS,BYTES), */
|
|
||||||
DEBUG_REC(STAID,WORDS),
|
|
||||||
DEBUG_REC(CURRENTSSID,STRING),
|
|
||||||
DEBUG_REC(CURRENTBSSID,BYTES),
|
|
||||||
DEBUG_REC(COMMSQUALITY,WORDS),
|
|
||||||
DEBUG_REC(CURRENTTXRATE,WORDS),
|
|
||||||
DEBUG_REC(CURRENTBEACONINTERVAL,WORDS),
|
|
||||||
DEBUG_REC(CURRENTSCALETHRESHOLDS,WORDS),
|
|
||||||
DEBUG_REC(PROTOCOLRSPTIME,WORDS),
|
|
||||||
DEBUG_REC(SHORTRETRYLIMIT,WORDS),
|
|
||||||
DEBUG_REC(LONGRETRYLIMIT,WORDS),
|
|
||||||
DEBUG_REC(MAXTRANSMITLIFETIME,WORDS),
|
|
||||||
DEBUG_REC(MAXRECEIVELIFETIME,WORDS),
|
|
||||||
DEBUG_REC(CFPOLLABLE,WORDS),
|
|
||||||
DEBUG_REC(AUTHENTICATIONALGORITHMS,WORDS),
|
|
||||||
DEBUG_REC(PRIVACYOPTIONIMPLEMENTED,WORDS),
|
|
||||||
DEBUG_REC(OWNMACADDR,BYTES),
|
|
||||||
DEBUG_REC(SCANRESULTSTABLE,WORDS),
|
|
||||||
DEBUG_REC(PHYTYPE,WORDS),
|
|
||||||
DEBUG_REC(CURRENTCHANNEL,WORDS),
|
|
||||||
DEBUG_REC(CURRENTPOWERSTATE,WORDS),
|
|
||||||
DEBUG_REC(CCAMODE,WORDS),
|
|
||||||
DEBUG_REC(SUPPORTEDDATARATES,WORDS),
|
|
||||||
DEBUG_REC(BUILDSEQ,BYTES),
|
|
||||||
DEBUG_REC(FWID,XSTRING)
|
|
||||||
#undef DEBUG_REC
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DEBUG_LTV_SIZE 128
|
|
||||||
|
|
||||||
static int orinoco_debug_dump_recs(struct net_device *dev)
|
|
||||||
{
|
|
||||||
struct orinoco_private *priv = netdev_priv(dev);
|
|
||||||
hermes_t *hw = &priv->hw;
|
|
||||||
u8 *val8;
|
|
||||||
u16 *val16;
|
|
||||||
int i,j;
|
|
||||||
u16 length;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
/* I'm not sure: we might have a lock here, so we'd better go
|
|
||||||
atomic, just in case. */
|
|
||||||
val8 = kmalloc(DEBUG_LTV_SIZE + 2, GFP_ATOMIC);
|
|
||||||
if (! val8)
|
|
||||||
return -ENOMEM;
|
|
||||||
val16 = (u16 *)val8;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(record_table); i++) {
|
|
||||||
u16 rid = record_table[i].rid;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
memset(val8, 0, DEBUG_LTV_SIZE + 2);
|
|
||||||
|
|
||||||
err = hermes_read_ltv(hw, USER_BAP, rid, DEBUG_LTV_SIZE,
|
|
||||||
&length, val8);
|
|
||||||
if (err) {
|
|
||||||
DEBUG(0, "Error %d reading RID 0x%04x\n", err, rid);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
val16 = (u16 *)val8;
|
|
||||||
if (length == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
printk(KERN_DEBUG "%-15s (0x%04x): length=%d (%d bytes)\tvalue=",
|
|
||||||
record_table[i].name,
|
|
||||||
rid, length, (length-1)*2);
|
|
||||||
len = min(((int)length-1)*2, DEBUG_LTV_SIZE);
|
|
||||||
|
|
||||||
switch (record_table[i].displaytype) {
|
|
||||||
case DISPLAY_WORDS:
|
|
||||||
for (j = 0; j < len / 2; j++)
|
|
||||||
printk("%04X-", le16_to_cpu(val16[j]));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DISPLAY_BYTES:
|
|
||||||
default:
|
|
||||||
for (j = 0; j < len; j++)
|
|
||||||
printk("%02X:", val8[j]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DISPLAY_STRING:
|
|
||||||
len = min(len, le16_to_cpu(val16[0])+2);
|
|
||||||
val8[len] = '\0';
|
|
||||||
printk("\"%s\"", (char *)&val16[1]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DISPLAY_XSTRING:
|
|
||||||
printk("'%s'", (char *)val8);
|
|
||||||
}
|
|
||||||
|
|
||||||
printk("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(val8);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
/* Debugging */
|
/* Debugging */
|
||||||
|
@ -4218,7 +4025,6 @@ EXPORT_SYMBOL(free_orinocodev);
|
||||||
|
|
||||||
EXPORT_SYMBOL(__orinoco_up);
|
EXPORT_SYMBOL(__orinoco_up);
|
||||||
EXPORT_SYMBOL(__orinoco_down);
|
EXPORT_SYMBOL(__orinoco_down);
|
||||||
EXPORT_SYMBOL(orinoco_stop);
|
|
||||||
EXPORT_SYMBOL(orinoco_reinit_firmware);
|
EXPORT_SYMBOL(orinoco_reinit_firmware);
|
||||||
|
|
||||||
EXPORT_SYMBOL(orinoco_interrupt);
|
EXPORT_SYMBOL(orinoco_interrupt);
|
||||||
|
|
|
@ -119,7 +119,6 @@ extern struct net_device *alloc_orinocodev(int sizeof_card,
|
||||||
extern void free_orinocodev(struct net_device *dev);
|
extern void free_orinocodev(struct net_device *dev);
|
||||||
extern int __orinoco_up(struct net_device *dev);
|
extern int __orinoco_up(struct net_device *dev);
|
||||||
extern int __orinoco_down(struct net_device *dev);
|
extern int __orinoco_down(struct net_device *dev);
|
||||||
extern int orinoco_stop(struct net_device *dev);
|
|
||||||
extern int orinoco_reinit_firmware(struct net_device *dev);
|
extern int orinoco_reinit_firmware(struct net_device *dev);
|
||||||
extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs);
|
extern irqreturn_t orinoco_interrupt(int irq, void * dev_id, struct pt_regs *regs);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue