[PATCH] libertas: make mesh functionality configurable
Dan Williams
dcbw at redhat.com
Fri Feb 16 13:01:22 EST 2007
On Fri, 2007-02-16 at 15:46 -0200, Marcelo Tosatti wrote:
> Holger,
>
> I think that detection of mesh functionality should be done at runtime,
> by checking if the firmware has mesh support, instead of being a
> compile-time option.
Yeah; that's what I'd like to see too, and it should be pretty easy.
Dan
> On Fri, Feb 16, 2007 at 04:58:11PM +0100, Holger Schurig wrote:
> > libertas: make mesh functionality configurable
> >
> > For devices that don't support wireless mesh via it's firmware,
> > it would be useless to compile the necessary code into the kernel.
> >
> > Signed-off-by: Holger Schurig <hs4233 at mail.mn-solutions.de>
> >
> > --- libertas-2.6.orig/drivers/net/wireless/Kconfig
> > +++ libertas-2.6/drivers/net/wireless/Kconfig
> > @@ -287,6 +287,13 @@
> > ---help---
> > A driver for Marvell Libertas 8388 USB devices.
> >
> > +config LIBERTAS_MESH
> > + bool "Support Wireless mesh"
> > + depends on LIBERTAS_USB
> > + ---help---
> > + This enables the mshX device as well as ioctl's for
> > + the wireless mesh and fwt tables.
> > +
> > config LIBERTAS_USB_DEBUG
> > bool "Enable full debugging output in the Libertas USB module."
> > depends on LIBERTAS_USB
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/cmd.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/cmd.c
> > @@ -866,6 +866,7 @@
> > return 0;
> > }
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static int wlan_cmd_fwt_access(wlan_private * priv,
> > struct cmd_ds_command *cmd,
> > u16 cmd_action, void *pdata_buf)
> > @@ -909,6 +910,7 @@
> >
> > return 0;
> > }
> > +#endif
> >
> > void libertas_queue_cmd(wlan_adapter * adapter, struct cmd_ctrl_node *cmdnode, u8 addtail)
> > {
> > @@ -1395,6 +1397,7 @@
> > ret = wlan_cmd_bt_access(priv, cmdptr, cmd_action, pdata_buf);
> > break;
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > case cmd_fwt_access:
> > ret = wlan_cmd_fwt_access(priv, cmdptr, cmd_action, pdata_buf);
> > break;
> > @@ -1402,6 +1405,7 @@
> > case cmd_mesh_access:
> > ret = wlan_cmd_mesh_access(priv, cmdptr, cmd_action, pdata_buf);
> > break;
> > +#endif
> >
> > case cmd_get_tsf:
> > cmdptr->command = cpu_to_le16(cmd_get_tsf);
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/cmdresp.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/cmdresp.c
> > @@ -222,7 +222,9 @@
> > }
> >
> > memcpy(priv->wlan_dev.netdev->dev_addr, adapter->current_addr, ETH_ALEN);
> > +#ifdef CONFIG_LIBERTAS_MESH
> > memcpy(priv->mesh_dev->dev_addr, adapter->current_addr, ETH_ALEN);
> > +#endif
> >
> > if (libertas_set_regiontable(priv, adapter->regioncode, 0)) {
> > ret = -1;
> > @@ -723,6 +725,7 @@
> > &resp->params.bt.addr1, 2 * ETH_ALEN);
> > spin_unlock_irqrestore(&adapter->driver_lock, flags);
> > break;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > case cmd_ret_fwt_access:
> > spin_lock_irqsave(&adapter->driver_lock, flags);
> > if (adapter->cur_cmd->pdata_buf)
> > @@ -737,6 +740,7 @@
> > &resp->params.mesh,
> > sizeof(resp->params.mesh));
> > break;
> > +#endif
> > case cmd_rte_802_11_tx_rate_query:
> > priv->adapter->txrate = resp->params.txrate.txrate;
> > break;
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/defs.h
> > +++ libertas-2.6/drivers/net/wireless/libertas/defs.h
> > @@ -113,7 +113,9 @@
> > * TODO: change to proper mesh flag when MAC understands it.
> > */
> > #define TxPD_CONTROL_WDS_FRAME (1<<17)
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define TxPD_MESH_FRAME TxPD_CONTROL_WDS_FRAME
> > +#endif
> >
> > /** RxPD status */
> >
> > @@ -125,7 +127,9 @@
> > * TODO: change to proper mesh flag when MAC understands it.
> > */
> > #define RxPD_CONTROL_WDS_FRAME (0x40)
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define RxPD_MESH_FRAME RxPD_CONTROL_WDS_FRAME
> > +#endif
> >
> > /** RSSI-related defines */
> > /* RSSI constants are used to implement 802.11 RSSI threshold
> > @@ -190,9 +194,11 @@
> >
> > #define MAX_LEDS 8
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define IS_MESH_FRAME(x) (x->cb[6])
> > #define SET_MESH_FRAME(x) (x->cb[6]=1)
> > #define UNSET_MESH_FRAME(x) (x->cb[6]=0)
> > +#endif
> >
> > /** Global Variable Declaration */
> > typedef struct _wlan_private wlan_private;
> > @@ -355,6 +361,7 @@
> > SNMP_MIB_VALUE_ADHOC
> > };
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > /* Default values for fwt commands. */
> > #define FWT_DEFAULT_METRIC 0
> > #define FWT_DEFAULT_DIR 1
> > @@ -365,5 +372,6 @@
> > #define FWT_DEFAULT_EXPIRATION 0
> > #define FWT_DEFAULT_SLEEPMODE 0
> > #define FWT_DEFAULT_SNR 0
> > +#endif
> >
> > #endif /* _WLAN_DEFS_H_ */
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/dev.h
> > +++ libertas-2.6/drivers/net/wireless/libertas/dev.h
> > @@ -115,6 +115,7 @@
> > u8 dnld_sent;
> > } wlan_dev_t, *pwlan_dev_t;
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > /* Mesh statistics */
> > struct wlan_mesh_stats {
> > u32 fwd_bcast_cnt; /* Fwd: Broadcast counter */
> > @@ -125,21 +126,28 @@
> > u32 fwd_drop_nobuf; /* Fwd: Run out of internal buffers */
> > u32 drop_blind; /* Rx: Dropped by blinding table */
> > };
> > +#endif
> >
> > /** Private structure for the MV device */
> > struct _wlan_private {
> > int open;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > int mesh_open;
> > +#endif
> > int infra_open;
> >
> > wlan_adapter *adapter;
> > wlan_dev_t wlan_dev;
> >
> > struct net_device_stats stats;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > struct net_device *mesh_dev ; /* Virtual device */
> > +#endif
> >
> > struct iw_statistics wstats;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > struct wlan_mesh_stats mstats;
> > +#endif
> > struct dentry *debugfs_dir;
> > struct dentry *debugfs_debug;
> > struct dentry *debugfs_files[6];
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/ethtool.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/ethtool.c
> > @@ -10,6 +10,8 @@
> > #include "dev.h"
> > #include "join.h"
> > #include "wext.h"
> > +
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static const char * mesh_stat_strings[]= {
> > "drop_duplicate_bcast",
> > "drop_ttl_zero",
> > @@ -19,6 +21,7 @@
> > "fwded_bcast_cnt",
> > "drop_blind_table"
> > };
> > +#endif
> >
> > static void libertas_ethtool_get_drvinfo(struct net_device *dev,
> > struct ethtool_drvinfo *info)
> > @@ -104,6 +107,7 @@
> > return 0;
> > }
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static void libertas_ethtool_get_stats(struct net_device * dev,
> > struct ethtool_stats * stats, u64 * data)
> > {
> > @@ -172,13 +176,16 @@
> > }
> > LEAVE();
> > }
> > +#endif
> >
> > struct ethtool_ops libertas_ethtool_ops = {
> > .get_drvinfo = libertas_ethtool_get_drvinfo,
> > .get_eeprom = libertas_ethtool_get_eeprom,
> > .get_eeprom_len = libertas_ethtool_get_eeprom_len,
> > +#ifdef CONFIG_LIBERTAS_MESH
> > .get_stats_count = libertas_ethtool_get_stats_count,
> > .get_ethtool_stats = libertas_ethtool_get_stats,
> > .get_strings = libertas_ethtool_get_strings,
> > +#endif
> > };
> >
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/host.h
> > +++ libertas-2.6/drivers/net/wireless/libertas/host.h
> > @@ -99,11 +99,13 @@
> > #define cmd_bt_access 0x0087
> > #define cmd_ret_bt_access 0x8087
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define cmd_fwt_access 0x0088
> > #define cmd_ret_fwt_access 0x8088
> >
> > #define cmd_mesh_access 0x0090
> > #define cmd_ret_mesh_access 0x8090
> > +#endif
> >
> > /* For the IEEE Power Save */
> > #define cmd_subcmd_enter_ps 0x0030
> > @@ -290,6 +292,7 @@
> > cmd_act_bt_access_reset
> > };
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > /* Define action or option for cmd_fwt_access */
> > enum cmd_fwt_access_opts {
> > cmd_act_fwt_access_add = 1,
> > @@ -311,6 +314,7 @@
> > cmd_act_mesh_get_mpp,
> > cmd_act_mesh_set_mpp,
> > };
> > +#endif
> >
> > /** Card Event definition */
> > #define MACREG_INT_CODE_TX_PPA_FREE 0x00000000
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/hostcmd.h
> > +++ libertas-2.6/drivers/net/wireless/libertas/hostcmd.h
> > @@ -604,6 +604,7 @@
> > u8 addr2[ETH_ALEN];
> > } __attribute__ ((packed));
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > struct cmd_ds_fwt_access {
> > u16 action;
> > u32 id;
> > @@ -626,6 +627,7 @@
> > u16 action;
> > u32 data[MESH_STATS_NUM + 1]; /* last position reserved */
> > } __attribute__ ((packed));
> > +#endif
> >
> > struct cmd_ds_command {
> > /* command header */
> > @@ -683,8 +685,10 @@
> >
> > struct cmd_tx_rate_query txrate;
> > struct cmd_ds_bt_access bt;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > struct cmd_ds_fwt_access fwt;
> > struct cmd_ds_mesh_access mesh;
> > +#endif
> > struct cmd_ds_get_tsf gettsf;
> > struct cmd_ds_802_11_subscribe_event subscribe_event;
> > } params;
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/ioctl.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/ioctl.c
> > @@ -1340,12 +1340,14 @@
> > * @param ptr A pointer to the input parameter string
> > * @return A pointer to the next parameter, or 0 if no parameters left.
> > */
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static char * next_param(char * ptr)
> > {
> > if (!ptr) return NULL;
> > while (*ptr == ' ' || *ptr == '\t') ++ptr;
> > return (*ptr == '\0') ? NULL : ptr;
> > }
> > +#endif
> >
> > /**
> > * @brief Add an entry to the FWT table
> > @@ -1353,6 +1355,7 @@
> > * @param req A pointer to ifreq structure
> > * @return 0 --success, otherwise fail
> > */
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static int wlan_fwt_add_ioctl(wlan_private * priv, struct ifreq *req)
> > {
> > struct iwreq *wrq = (struct iwreq *)req;
> > @@ -1876,6 +1879,8 @@
> > return ret;
> > }
> >
> > +#endif
> > +
> > /**
> > * @brief ioctl function - entry point
> > *
> > @@ -1931,9 +1936,11 @@
> > case WLAN_SUBCMD_BT_RESET: /* bt_reset */
> > wlan_bt_reset_ioctl(priv);
> > break;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > case WLAN_SUBCMD_FWT_RESET: /* fwt_reset */
> > wlan_fwt_reset_ioctl(priv);
> > break;
> > +#endif
> > } /* End of switch */
> > break;
> >
> > @@ -2093,10 +2100,12 @@
> > ret = wlan_set_debugmode_ioctl(priv, req);
> > break;
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > case WLAN_SUBCMD_MESH_SET_TTL:
> > idata = SUBCMD_DATA(wrq);
> > ret = wlan_mesh_set_ttl_ioctl(priv, idata);
> > break;
> > +#endif
> >
> > default:
> > ret = -EOPNOTSUPP;
> > @@ -2146,6 +2155,7 @@
> > case WLAN_SUBCMD_BT_LIST:
> > ret = wlan_bt_list_ioctl(priv, req);
> > break;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > case WLAN_SUBCMD_FWT_ADD:
> > ret = wlan_fwt_add_ioctl(priv, req);
> > break;
> > @@ -2164,6 +2174,7 @@
> > case WLAN_SUBCMD_FWT_LIST_ROUTE:
> > ret = wlan_fwt_list_route_ioctl(priv, req);
> > break;
> > +#endif
> > }
> > break;
> >
> > @@ -2203,6 +2214,8 @@
> > case WLAN_GET_TX_RATE:
> > ret = wlan_get_txrate_ioctl(priv, req);
> > break;
> > +
> > +#ifdef CONFIG_LIBERTAS_MESH
> > case WLAN_SUBCMD_FWT_CLEANUP: /* fwt_cleanup */
> > ret = wlan_fwt_cleanup_ioctl(priv, req);
> > break;
> > @@ -2214,6 +2227,7 @@
> > case WLAN_SUBCMD_MESH_GET_TTL:
> > ret = wlan_mesh_get_ttl_ioctl(priv, req);
> > break;
> > +#endif
> >
> > default:
> > ret = -EOPNOTSUPP;
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/main.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/main.c
> > @@ -183,6 +183,8 @@
> > */
> > #define to_net_dev(class) container_of(class, struct net_device, class_dev)
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > +
> > /**
> > * @brief Get function for sysfs attribute libertas_mpp
> > */
> > @@ -222,6 +224,8 @@
> > static CLASS_DEVICE_ATTR(libertas_mpp, 0644, libertas_mpp_get,
> > libertas_mpp_set );
> >
> > +#endif
> > +
> > /**
> > * @brief Check if the device can be open and wait if necessary.
> > *
> > @@ -281,6 +285,7 @@
> > * @param dev A pointer to net_device structure
> > * @return 0
> > */
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static int mesh_open(struct net_device *dev)
> > {
> > wlan_private *priv = (wlan_private *) dev->priv ;
> > @@ -293,6 +298,7 @@
> > return wlan_dev_open(priv->wlan_dev.netdev) ;
> > return 0;
> > }
> > +#endif
> >
> > /**
> > * @brief This function opens the ethX interface
> > @@ -332,6 +338,7 @@
> > * @param dev A pointer to net_device structure
> > * @return 0
> > */
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static int mesh_close(struct net_device *dev)
> > {
> > wlan_private *priv = (wlan_private *) (dev->priv);
> > @@ -343,6 +350,7 @@
> > else
> > return 0;
> > }
> > +#endif
> >
> > /**
> > * @brief This function closes the ethX interface
> > @@ -355,10 +363,14 @@
> >
> > netif_stop_queue(priv->wlan_dev.netdev);
> > priv->infra_open = 0;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > if (priv->mesh_open == 0)
> > return wlan_dev_close( ((wlan_private *) dev->priv)->wlan_dev.netdev) ;
> > else
> > return 0;
> > +#else
> > + return wlan_dev_close( ((wlan_private *) dev->priv)->wlan_dev.netdev) ;
> > +#endif
> > }
> >
> >
> > @@ -498,6 +510,7 @@
> > * @brief Mark mesh packets and handover them to wlan_hard_start_xmit
> > *
> > */
> > +#ifdef CONFIG_LIBERTAS_MESH
> > static int mesh_pre_start_xmit(struct sk_buff *skb, struct net_device *dev)
> > {
> > wlan_private *priv = dev->priv;
> > @@ -518,6 +531,7 @@
> > LEAVE();
> > return wlan_hard_start_xmit(skb, dev);
> > }
> > +#endif
> >
> > static void wlan_tx_timeout(struct net_device *dev)
> > {
> > @@ -586,7 +600,9 @@
> >
> > lbs_dbg_hex("adapter->macaddr:", adapter->current_addr, ETH_ALEN);
> > memcpy(dev->dev_addr, adapter->current_addr, ETH_ALEN);
> > +#ifdef CONFIG_LIBERTAS_MESH
> > memcpy(((wlan_private *) dev->priv)->mesh_dev->dev_addr, adapter->current_addr, ETH_ALEN);
> > +#endif
> >
> > done:
> > LEAVE();
> > @@ -866,7 +882,9 @@
> > wlan_private *wlan_add_card(void *card)
> > {
> > struct net_device *dev = NULL;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > struct net_device *mesh_dev = NULL;
> > +#endif
> > wlan_private *priv = NULL;
> >
> > ENTER();
> > @@ -885,6 +903,7 @@
> > goto err_kmalloc;
> > }
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > /* Allocate a virtual mesh device */
> > if (!(mesh_dev = alloc_netdev(0, "msh%d", ether_setup))) {
> > lbs_pr_debug(1, "Init ethernet device failed!\n");
> > @@ -893,34 +912,45 @@
> >
> > /* Both intervaces share the priv structure */
> > mesh_dev->priv = priv;
> > +#endif
> >
> > /* init wlan_adapter */
> > memset(priv->adapter, 0, sizeof(wlan_adapter));
> >
> > priv->wlan_dev.netdev = dev;
> > priv->wlan_dev.card = card;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > priv->mesh_open = 0;
> > - priv->infra_open = 0;
> > priv->mesh_dev = mesh_dev;
> > +#endif
> > + priv->infra_open = 0;
> > #ifdef ENABLE_PM
> > wlanpriv = priv;
> > #endif
> >
> > SET_MODULE_OWNER(dev);
> > +#ifdef CONFIG_LIBERTAS_MESH
> > SET_MODULE_OWNER(mesh_dev);
> > +#endif
> >
> > /* Setup the OS Interface to our functions */
> > dev->open = wlan_open;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > dev->hard_start_xmit = wlan_pre_start_xmit;
> > +#else
> > + dev->hard_start_xmit = wlan_hard_start_xmit;
> > +#endif
> > dev->stop = wlan_close;
> > dev->do_ioctl = libertas_do_ioctl;
> > dev->set_mac_address = wlan_set_mac_address;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > mesh_dev->open = mesh_open;
> > mesh_dev->hard_start_xmit = mesh_pre_start_xmit;
> > mesh_dev->stop = mesh_close;
> > mesh_dev->do_ioctl = libertas_do_ioctl;
> > memcpy(mesh_dev->dev_addr, priv->wlan_dev.netdev->dev_addr,
> > sizeof(priv->wlan_dev.netdev->dev_addr));
> > +#endif
> >
> > #define WLAN_WATCHDOG_TIMEOUT (5 * HZ)
> >
> > @@ -928,13 +958,17 @@
> > dev->get_stats = wlan_get_stats;
> > dev->watchdog_timeo = WLAN_WATCHDOG_TIMEOUT;
> > dev->ethtool_ops = &libertas_ethtool_ops;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > mesh_dev->get_stats = wlan_get_stats;
> > mesh_dev->ethtool_ops = &libertas_ethtool_ops;
> > +#endif
> >
> > #ifdef WIRELESS_EXT
> > dev->wireless_handlers = (struct iw_handler_def *)&libertas_handler_def;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > mesh_dev->wireless_handlers = (struct iw_handler_def *)&libertas_handler_def;
> > #endif
> > +#endif
> > #define NETIF_F_DYNALLOC 16
> > dev->features |= NETIF_F_DYNALLOC;
> > dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
> > @@ -977,11 +1011,13 @@
> > goto err_init_fw;
> > }
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > /* Register virtual mesh interface */
> > if (register_netdev(mesh_dev)) {
> > lbs_pr_info("Cannot register mesh virtual interface!\n");
> > goto err_init_fw;
> > }
> > +#endif
> >
> > lbs_pr_info("%s: Marvell Wlan 802.11 adapter\n", dev->name);
> >
> > @@ -995,14 +1031,18 @@
> > if (!(wlan_pm_dev = pm_register(PM_UNKNOWN_DEV, 0, wlan_pm_callback)))
> > lbs_pr_alert( "failed to register PM callback\n");
> > #endif
> > +#ifdef CONFIG_LIBERTAS_MESH
> > if (class_device_create_file(&(mesh_dev->class_dev), &class_device_attr_libertas_mpp))
> > goto err_create_file;
> > +#endif
> >
> > LEAVE();
> > return priv;
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > err_create_file:
> > class_device_remove_file(&(mesh_dev->class_dev), &class_device_attr_libertas_mpp);
> > +#endif
> > err_init_fw:
> > libertas_sbi_unregister_dev(priv);
> > err_registerdev:
> > @@ -1013,7 +1053,9 @@
> > kfree(priv->adapter);
> > err_kmalloc:
> > free_netdev(dev);
> > +#ifdef CONFIG_LIBERTAS_MESH
> > free_netdev(mesh_dev);
> > +#endif
> > #ifdef ENABLE_PM
> > wlanpriv = NULL;
> > #endif
> > @@ -1040,7 +1082,9 @@
> > {
> > wlan_adapter *adapter;
> > struct net_device *dev;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > struct net_device *mesh_dev;
> > +#endif
> > union iwreq_data wrqu;
> > int i;
> >
> > @@ -1059,16 +1103,21 @@
> > }
> >
> > dev = priv->wlan_dev.netdev;
> > - mesh_dev = priv->mesh_dev;
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > + mesh_dev = priv->mesh_dev;
> > netif_stop_queue(mesh_dev);
> > +#endif
> > +
> > netif_stop_queue(priv->wlan_dev.netdev);
> > netif_carrier_off(priv->wlan_dev.netdev);
> >
> > wake_pending_cmdnodes(priv);
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > class_device_remove_file(&(mesh_dev->class_dev), &class_device_attr_libertas_mpp);
> > unregister_netdev(mesh_dev);
> > +#endif
> > unregister_netdev(dev);
> >
> > cancel_delayed_work(&priv->assoc_work);
> > @@ -1108,8 +1157,10 @@
> > lbs_pr_debug(1, "Unregister finish\n");
> >
> > priv->wlan_dev.netdev = NULL;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > priv->mesh_dev = NULL ;
> > free_netdev(mesh_dev);
> > +#endif
> > free_netdev(dev);
> > #ifdef ENABLE_PM
> > wlanpriv = NULL;
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/rx.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/rx.c
> > @@ -140,10 +140,14 @@
> > {
> > lbs_pr_debug(1, "skb->data=%p\n", skb->data);
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > if(IS_MESH_FRAME(skb))
> > skb->dev = priv->mesh_dev;
> > else
> > skb->dev = priv->wlan_dev.netdev;
> > +#else
> > + skb->dev = priv->wlan_dev.netdev;
> > +#endif
> > skb->protocol = eth_type_trans(skb, priv->wlan_dev.netdev);
> > skb->ip_summed = CHECKSUM_UNNECESSARY;
> >
> > @@ -184,10 +188,12 @@
> >
> > p_rx_pkt = (struct rxpackethdr *) skb->data;
> > p_rx_pd = &p_rx_pkt->rx_pd;
> > +#ifdef CONFIG_LIBERTAS_MESH
> > if (p_rx_pd->rx_control & RxPD_MESH_FRAME)
> > SET_MESH_FRAME(skb);
> > else
> > UNSET_MESH_FRAME(skb);
> > +#endif
> >
> > lbs_dbg_hex("RX Data: Before chop rxpd", skb->data,
> > min_t(unsigned int, skb->len, 100));
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/tx.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/tx.c
> > @@ -122,9 +122,11 @@
> >
> > lbs_dbg_hex("txpd", (u8 *) plocaltxpd, sizeof(struct txpd));
> >
> > +#ifdef CONFIG_LIBERTAS_MESH
> > if (IS_MESH_FRAME(skb)) {
> > plocaltxpd->tx_control |= TxPD_MESH_FRAME;
> > }
> > +#endif
> >
> > memcpy(ptr, plocaltxpd, sizeof(struct txpd));
> >
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/wext.c
> > +++ libertas-2.6/drivers/net/wireless/libertas/wext.c
> > @@ -1144,11 +1144,13 @@
> > IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
> > IW_PRIV_TYPE_NONE,
> > "debugmode"},
> > +#ifdef CONFIG_LIBERTAS_MESH
> > {
> > WLAN_SUBCMD_MESH_SET_TTL,
> > IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
> > IW_PRIV_TYPE_NONE,
> > "mesh_set_ttl"},
> > +#endif
> > {
> > WLAN_SETNONE_GETONEINT,
> > IW_PRIV_TYPE_NONE,
> > @@ -1194,6 +1196,7 @@
> > IW_PRIV_TYPE_NONE,
> > IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
> > "get_debugmode"},
> > +#ifdef CONFIG_LIBERTAS_MESH
> > {
> > WLAN_SUBCMD_FWT_CLEANUP,
> > IW_PRIV_TYPE_NONE,
> > @@ -1209,6 +1212,7 @@
> > IW_PRIV_TYPE_NONE,
> > IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
> > "mesh_get_ttl"},
> > +#endif
> > {
> > WLAN_SETNONE_GETTWELVE_CHAR,
> > IW_PRIV_TYPE_NONE,
> > @@ -1264,11 +1268,13 @@
> > IW_PRIV_TYPE_NONE,
> > IW_PRIV_TYPE_NONE,
> > "wlanidle-off"},
> > +#ifdef CONFIG_LIBERTAS_MESH
> > {
> > WLAN_SUBCMD_FWT_RESET,
> > IW_PRIV_TYPE_NONE,
> > IW_PRIV_TYPE_NONE,
> > "fwt_reset"},
> > +#endif
> > {
> > WLAN_SUBCMD_BT_RESET,
> > IW_PRIV_TYPE_NONE,
> > @@ -1295,6 +1301,7 @@
> > IW_PRIV_TYPE_CHAR | 128,
> > IW_PRIV_TYPE_CHAR | 128,
> > "bt_list"},
> > +#ifdef CONFIG_LIBERTAS_MESH
> > /* FWT Management */
> > {
> > WLAN_SUBCMD_FWT_ADD,
> > @@ -1326,6 +1333,7 @@
> > IW_PRIV_TYPE_CHAR | 128,
> > IW_PRIV_TYPE_CHAR | 128,
> > "fwt_list_route"},
> > +#endif
> > {
> > WLANSCAN_MODE,
> > IW_PRIV_TYPE_CHAR | 128,
> > --- libertas-2.6.orig/drivers/net/wireless/libertas/wext.h
> > +++ libertas-2.6/drivers/net/wireless/libertas/wext.h
> > @@ -31,7 +31,9 @@
> > #define WLANWLANIDLEON 10
> > #define WLANWLANIDLEOFF 11
> > #define WLAN_SUBCMD_BT_RESET 13
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define WLAN_SUBCMD_FWT_RESET 14
> > +#endif
> >
> > #define WLANGETLOG (WLANIOCTL + 9)
> > #define GETLOG_BUFSIZE 300
> > @@ -48,9 +50,11 @@
> > #define WLAN_GET_LINKMODE 6
> > #define WLAN_GET_RADIOMODE 7
> > #define WLAN_GET_DEBUGMODE 8
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define WLAN_SUBCMD_FWT_CLEANUP 15
> > #define WLAN_SUBCMD_FWT_TIME 16
> > #define WLAN_SUBCMD_MESH_GET_TTL 17
> > +#endif
> >
> > #define WLANREGCFRDWR (WLANIOCTL + 18)
> >
> > @@ -85,7 +89,9 @@
> > #define WLAN_SET_LINKMODE 15
> > #define WLAN_SET_RADIOMODE 16
> > #define WLAN_SET_DEBUGMODE 17
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define WLAN_SUBCMD_MESH_SET_TTL 18
> > +#endif
> >
> > #define WLAN_SET128CHAR_GET128CHAR (WLANIOCTL + 25)
> > #define WLANSCAN_MODE 6
> > @@ -95,12 +101,14 @@
> > #define WLAN_SUBCMD_BT_ADD 18
> > #define WLAN_SUBCMD_BT_DEL 19
> > #define WLAN_SUBCMD_BT_LIST 20
> > +#ifdef CONFIG_LIBERTAS_MESH
> > #define WLAN_SUBCMD_FWT_ADD 21
> > #define WLAN_SUBCMD_FWT_DEL 22
> > #define WLAN_SUBCMD_FWT_LOOKUP 23
> > #define WLAN_SUBCMD_FWT_LIST_NEIGHBOR 24
> > #define WLAN_SUBCMD_FWT_LIST 25
> > #define WLAN_SUBCMD_FWT_LIST_ROUTE 26
> > +#endif
> >
> > #define WLAN_SET_GET_SIXTEEN_INT (WLANIOCTL + 29)
> > #define WLAN_TPCCFG 1
> >
> > _______________________________________________
> > libertas-dev mailing list
> > libertas-dev at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/libertas-dev
>
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev
More information about the libertas-dev
mailing list