📄 ray_cs.c
字号:
*/static int ray_get_range(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra){ struct iw_range *range = (struct iw_range *) extra; memset((char *) range, 0, sizeof(struct iw_range)); /* Set the length (very important for backward compatibility) */ dwrq->length = sizeof(struct iw_range); /* Set the Wireless Extension versions */ range->we_version_compiled = WIRELESS_EXT; range->we_version_source = 9; /* Set information in the range struct */ range->throughput = 1.1 * 1000 * 1000; /* Put the right number here */ range->num_channels = hop_pattern_length[(int)country]; range->num_frequency = 0; range->max_qual.qual = 0; range->max_qual.level = 255; /* What's the correct value ? */ range->max_qual.noise = 255; /* Idem */ range->num_bitrates = 2; range->bitrate[0] = 1000000; /* 1 Mb/s */ range->bitrate[1] = 2000000; /* 2 Mb/s */ return 0;}/*------------------------------------------------------------------*//* * Wireless Private Handler : set framing mode */static int ray_set_framing(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ translate = *(extra); /* Set framing mode */ return 0;}/*------------------------------------------------------------------*//* * Wireless Private Handler : get framing mode */static int ray_get_framing(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ *(extra) = translate; return 0;}/*------------------------------------------------------------------*//* * Wireless Private Handler : get country */static int ray_get_country(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ *(extra) = country; return 0;}/*------------------------------------------------------------------*//* * Commit handler : called after a bunch of SET operations */static int ray_commit(struct net_device *dev, struct iw_request_info *info, /* NULL */ void *zwrq, /* NULL */ char *extra) /* NULL */{ return 0;}/*------------------------------------------------------------------*//* * Stats handler : return Wireless Stats */static iw_stats * ray_get_wireless_stats(struct net_device * dev){ ray_dev_t * local = (ray_dev_t *) dev->priv; dev_link_t *link = local->finder; struct status __iomem *p = local->sram + STATUS_BASE; if(local == (ray_dev_t *) NULL) return (iw_stats *) NULL; local->wstats.status = local->card_status;#ifdef WIRELESS_SPY if((local->spy_data.spy_number > 0) && (local->sparm.b5.a_network_type == 0)) { /* Get it from the first node in spy list */ local->wstats.qual.qual = local->spy_data.spy_stat[0].qual; local->wstats.qual.level = local->spy_data.spy_stat[0].level; local->wstats.qual.noise = local->spy_data.spy_stat[0].noise; local->wstats.qual.updated = local->spy_data.spy_stat[0].updated; }#endif /* WIRELESS_SPY */ if((link->state & DEV_PRESENT)) { local->wstats.qual.noise = readb(&p->rxnoise); local->wstats.qual.updated |= 4; } return &local->wstats;} /* end ray_get_wireless_stats *//*------------------------------------------------------------------*//* * Structures to export the Wireless Handlers */static const iw_handler ray_handler[] = { [SIOCSIWCOMMIT-SIOCIWFIRST] = (iw_handler) ray_commit, [SIOCGIWNAME -SIOCIWFIRST] = (iw_handler) ray_get_name, [SIOCSIWFREQ -SIOCIWFIRST] = (iw_handler) ray_set_freq, [SIOCGIWFREQ -SIOCIWFIRST] = (iw_handler) ray_get_freq, [SIOCSIWMODE -SIOCIWFIRST] = (iw_handler) ray_set_mode, [SIOCGIWMODE -SIOCIWFIRST] = (iw_handler) ray_get_mode, [SIOCGIWRANGE -SIOCIWFIRST] = (iw_handler) ray_get_range,#ifdef WIRELESS_SPY [SIOCSIWSPY -SIOCIWFIRST] = (iw_handler) iw_handler_set_spy, [SIOCGIWSPY -SIOCIWFIRST] = (iw_handler) iw_handler_get_spy, [SIOCSIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_set_thrspy, [SIOCGIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_get_thrspy,#endif /* WIRELESS_SPY */ [SIOCGIWAP -SIOCIWFIRST] = (iw_handler) ray_get_wap, [SIOCSIWESSID -SIOCIWFIRST] = (iw_handler) ray_set_essid, [SIOCGIWESSID -SIOCIWFIRST] = (iw_handler) ray_get_essid, [SIOCSIWRATE -SIOCIWFIRST] = (iw_handler) ray_set_rate, [SIOCGIWRATE -SIOCIWFIRST] = (iw_handler) ray_get_rate, [SIOCSIWRTS -SIOCIWFIRST] = (iw_handler) ray_set_rts, [SIOCGIWRTS -SIOCIWFIRST] = (iw_handler) ray_get_rts, [SIOCSIWFRAG -SIOCIWFIRST] = (iw_handler) ray_set_frag, [SIOCGIWFRAG -SIOCIWFIRST] = (iw_handler) ray_get_frag,};#define SIOCSIPFRAMING SIOCIWFIRSTPRIV /* Set framing mode */#define SIOCGIPFRAMING SIOCIWFIRSTPRIV + 1 /* Get framing mode */#define SIOCGIPCOUNTRY SIOCIWFIRSTPRIV + 3 /* Get country code */static const iw_handler ray_private_handler[] = { [0] = (iw_handler) ray_set_framing, [1] = (iw_handler) ray_get_framing, [3] = (iw_handler) ray_get_country,};static const struct iw_priv_args ray_private_args[] = {/* cmd, set_args, get_args, name */{ SIOCSIPFRAMING, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0, "set_framing" },{ SIOCGIPFRAMING, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "get_framing" },{ SIOCGIPCOUNTRY, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "get_country" },};static const struct iw_handler_def ray_handler_def ={ .num_standard = sizeof(ray_handler)/sizeof(iw_handler), .num_private = sizeof(ray_private_handler)/sizeof(iw_handler), .num_private_args = sizeof(ray_private_args)/sizeof(struct iw_priv_args), .standard = ray_handler, .private = ray_private_handler, .private_args = ray_private_args, .get_wireless_stats = ray_get_wireless_stats,};/*===========================================================================*/static int ray_open(struct net_device *dev){ dev_link_t *link; ray_dev_t *local = (ray_dev_t *)dev->priv; DEBUG(1, "ray_open('%s')\n", dev->name); for (link = dev_list; link; link = link->next) if (link->priv == dev) break; if (!DEV_OK(link)) { return -ENODEV; } if (link->open == 0) local->num_multi = 0; link->open++; /* If the card is not started, time to start it ! - Jean II */ if(local->card_status == CARD_AWAITING_PARAM) { int i; DEBUG(1,"ray_open: doing init now !\n"); /* Download startup parameters */ if ( (i = dl_startup_params(dev)) < 0) { printk(KERN_INFO "ray_dev_init dl_startup_params failed - " "returns 0x%x\n",i); return -1; } } if (sniffer) netif_stop_queue(dev); else netif_start_queue(dev); DEBUG(2,"ray_open ending\n"); return 0;} /* end ray_open *//*===========================================================================*/static int ray_dev_close(struct net_device *dev){ dev_link_t *link; DEBUG(1, "ray_dev_close('%s')\n", dev->name); for (link = dev_list; link; link = link->next) if (link->priv == dev) break; if (link == NULL) return -ENODEV; link->open--; netif_stop_queue(dev); /* In here, we should stop the hardware (stop card from beeing active) * and set local->card_status to CARD_AWAITING_PARAM, so that while the * card is closed we can chage its configuration. * Probably also need a COR reset to get sane state - Jean II */ return 0;} /* end ray_dev_close *//*===========================================================================*/static void ray_reset(struct net_device *dev) { DEBUG(1,"ray_reset entered\n"); return;}/*===========================================================================*//* Cause a firmware interrupt if it is ready for one *//* Return nonzero if not ready */static int interrupt_ecf(ray_dev_t *local, int ccs){ int i = 50; dev_link_t *link = local->finder; if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs interrupt_ecf - device not present\n"); return -1; } DEBUG(2,"interrupt_ecf(local=%p, ccs = 0x%x\n",local,ccs); while ( i && (readb(local->amem + CIS_OFFSET + ECF_INTR_OFFSET) & ECF_INTR_SET)) i--; if (i == 0) { DEBUG(2,"ray_cs interrupt_ecf card not ready for interrupt\n"); return -1; } /* Fill the mailbox, then kick the card */ writeb(ccs, local->sram + SCB_BASE); writeb(ECF_INTR_SET, local->amem + CIS_OFFSET + ECF_INTR_OFFSET); return 0;} /* interrupt_ecf *//*===========================================================================*//* Get next free transmit CCS *//* Return - index of current tx ccs */static int get_free_tx_ccs(ray_dev_t *local){ int i; struct ccs __iomem *pccs = ccs_base(local); dev_link_t *link = local->finder; if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n"); return ECARDGONE; } if (test_and_set_bit(0,&local->tx_ccs_lock)) { DEBUG(1,"ray_cs tx_ccs_lock busy\n"); return ECCSBUSY; } for (i=0; i < NUMBER_OF_TX_CCS; i++) { if (readb(&(pccs+i)->buffer_status) == CCS_BUFFER_FREE) { writeb(CCS_BUFFER_BUSY, &(pccs+i)->buffer_status); writeb(CCS_END_LIST, &(pccs+i)->link); local->tx_ccs_lock = 0; return i; } } local->tx_ccs_lock = 0; DEBUG(2,"ray_cs ERROR no free tx CCS for raylink card\n"); return ECCSFULL;} /* get_free_tx_ccs *//*===========================================================================*//* Get next free CCS *//* Return - index of current ccs */static int get_free_ccs(ray_dev_t *local){ int i; struct ccs __iomem *pccs = ccs_base(local); dev_link_t *link = local->finder; if (!(link->state & DEV_PRESENT)) { DEBUG(2,"ray_cs get_free_ccs - device not present\n"); return ECARDGONE; } if (test_and_set_bit(0,&local->ccs_lock)) { DEBUG(1,"ray_cs ccs_lock busy\n"); return ECCSBUSY; } for (i = NUMBER_OF_TX_CCS; i < NUMBER_OF_CCS; i++) { if (readb(&(pccs+i)->buffer_status) == CCS_BUFFER_FREE) { writeb(CCS_BUFFER_BUSY, &(pccs+i)->buffer_status); writeb(CCS_END_LIST, &(pccs+i)->link); local->ccs_lock = 0; return i; } } local->ccs_lock = 0; DEBUG(1,"ray_cs ERROR no free CCS for raylink card\n"); return ECCSFULL;} /* get_free_ccs *//*===========================================================================*/static void authenticate_timeout(u_long data){ ray_dev_t *local = (ray_dev_t *)data; del_timer(&local->timer); printk(KERN_INFO "ray_cs Authentication with access point failed" " - timeout\n"); join_net((u_long)local);}/*===========================================================================*/static int asc_to_int(char a){ if (a < '0') return -1; if (a <= '9') return (a - '0'); if (a < 'A') return -1; if (a <= 'F') return (10 + a - 'A'); if (a < 'a') return -1; if (a <= 'f') return (10 + a - 'a'); return -1;}/*===========================================================================*/static int parse_addr(char *in_str, UCHAR *out){ int len; int i,j,k; int status; if (in_str == NULL) return 0; if ((len = strlen(in_str)) < 2) return 0; memset(out, 0, ADDRLEN); status = 1; j = len - 1; if (j > 12) j = 12; i = 5; while (j > 0) { if ((k = asc_to_int(in_str[j--])) != -1) out[i] = k; else return 0; if (j == 0) break; if ((k = asc_to_int(in_str[j--])) != -1) out[i] += k << 4; else return 0; if (!i--) break; } return status;}/*===========================================================================*/static struct net_device_stats *ray_get_stats(struct net_device *dev){ ray_dev_t *local = (ray_dev_t *)dev->priv; dev_link_t *link = local->finder;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -