aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h92
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c11
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c11
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c16
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/usb.c15
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h3
9 files changed, 111 insertions, 47 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index 24bc4e3e162b..fd672bf53867 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -470,7 +470,6 @@ struct brcmf_pub {
470 struct brcmf_bus *bus_if; 470 struct brcmf_bus *bus_if;
471 struct brcmf_proto *prot; 471 struct brcmf_proto *prot;
472 struct brcmf_cfg80211_info *config; 472 struct brcmf_cfg80211_info *config;
473 struct device *dev; /* fullmac dongle device pointer */
474 473
475 /* Internal brcmf items */ 474 /* Internal brcmf items */
476 uint hdrlen; /* Total BRCMF header length (proto + bus) */ 475 uint hdrlen; /* Total BRCMF header length (proto + bus) */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index b8f248797f62..dd38b78a9726 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -43,36 +43,90 @@ struct brcmf_bus_dcmd {
43 struct list_head list; 43 struct list_head list;
44}; 44};
45 45
46/* interface structure between common and bus layer */ 46/**
47 * struct brcmf_bus_ops - bus callback operations.
48 *
49 * @init: prepare for communication with dongle.
50 * @stop: clear pending frames, disable data flow.
51 * @txdata: send a data frame to the dongle (callee disposes skb).
52 * @txctl: transmit a control request message to dongle.
53 * @rxctl: receive a control response message from dongle.
54 *
55 * This structure provides an abstract interface towards the
56 * bus specific driver. For control messages to common driver
57 * will assure there is only one active transaction.
58 */
59struct brcmf_bus_ops {
60 int (*init)(struct device *dev);
61 void (*stop)(struct device *dev);
62 int (*txdata)(struct device *dev, struct sk_buff *skb);
63 int (*txctl)(struct device *dev, unsigned char *msg, uint len);
64 int (*rxctl)(struct device *dev, unsigned char *msg, uint len);
65};
66
67/**
68 * struct brcmf_bus - interface structure between common and bus layer
69 *
70 * @bus_priv: pointer to private bus device.
71 * @dev: device pointer of bus device.
72 * @drvr: public driver information.
73 * @state: operational state of the bus interface.
74 * @maxctl: maximum size for rxctl request message.
75 * @drvr_up: indicates driver up/down status.
76 * @tx_realloc: number of tx packets realloced for headroom.
77 * @dstats: dongle-based statistical data.
78 * @align: alignment requirement for the bus.
79 * @dcmd_list: bus/device specific dongle initialization commands.
80 */
47struct brcmf_bus { 81struct brcmf_bus {
48 union { 82 union {
49 struct brcmf_sdio_dev *sdio; 83 struct brcmf_sdio_dev *sdio;
50 struct brcmf_usbdev *usb; 84 struct brcmf_usbdev *usb;
51 } bus_priv; 85 } bus_priv;
52 struct brcmf_pub *drvr; /* pointer to driver pub structure brcmf_pub */ 86 struct device *dev;
87 struct brcmf_pub *drvr;
53 enum brcmf_bus_state state; 88 enum brcmf_bus_state state;
54 uint maxctl; /* Max size rxctl request from proto to bus */ 89 uint maxctl;
55 bool drvr_up; /* Status flag of driver up/down */ 90 bool drvr_up;
56 unsigned long tx_realloc; /* Tx packets realloced for headroom */ 91 unsigned long tx_realloc;
57 struct dngl_stats dstats; /* Stats for dongle-based data */ 92 struct dngl_stats dstats;
58 u8 align; /* bus alignment requirement */ 93 u8 align;
59 struct list_head dcmd_list; 94 struct list_head dcmd_list;
60 95
61 /* interface functions pointers */ 96 struct brcmf_bus_ops *ops;
62 /* Stop bus module: clear pending frames, disable data flow */
63 void (*brcmf_bus_stop)(struct device *);
64 /* Initialize bus module: prepare for communication w/dongle */
65 int (*brcmf_bus_init)(struct device *);
66 /* Send a data frame to the dongle. Callee disposes of txp. */
67 int (*brcmf_bus_txdata)(struct device *, struct sk_buff *);
68 /* Send/receive a control message to/from the dongle.
69 * Expects caller to enforce a single outstanding transaction.
70 */
71 int (*brcmf_bus_txctl)(struct device *, unsigned char *, uint);
72 int (*brcmf_bus_rxctl)(struct device *, unsigned char *, uint);
73}; 97};
74 98
75/* 99/*
100 * callback wrappers
101 */
102static inline int brcmf_bus_init(struct brcmf_bus *bus)
103{
104 return bus->ops->init(bus->dev);
105}
106
107static inline void brcmf_bus_stop(struct brcmf_bus *bus)
108{
109 bus->ops->stop(bus->dev);
110}
111
112static inline int brcmf_bus_txdata(struct brcmf_bus *bus, struct sk_buff *skb)
113{
114 return bus->ops->txdata(bus->dev, skb);
115}
116
117static inline
118int brcmf_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
119{
120 return bus->ops->txctl(bus->dev, msg, len);
121}
122
123static inline
124int brcmf_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
125{
126 return bus->ops->rxctl(bus->dev, msg, len);
127}
128
129/*
76 * interface functions from common layer 130 * interface functions from common layer
77 */ 131 */
78 132
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
index 87536d38a4ca..b123d25366cd 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
@@ -117,9 +117,7 @@ static int brcmf_proto_cdc_msg(struct brcmf_pub *drvr)
117 len = CDC_MAX_MSG_SIZE; 117 len = CDC_MAX_MSG_SIZE;
118 118
119 /* Send request */ 119 /* Send request */
120 return drvr->bus_if->brcmf_bus_txctl(drvr->dev, 120 return brcmf_bus_txctl(drvr->bus_if, (unsigned char *)&prot->msg, len);
121 (unsigned char *)&prot->msg,
122 len);
123} 121}
124 122
125static int brcmf_proto_cdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len) 123static int brcmf_proto_cdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len)
@@ -128,11 +126,10 @@ static int brcmf_proto_cdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len)
128 struct brcmf_proto *prot = drvr->prot; 126 struct brcmf_proto *prot = drvr->prot;
129 127
130 brcmf_dbg(TRACE, "Enter\n"); 128 brcmf_dbg(TRACE, "Enter\n");
131 129 len += sizeof(struct brcmf_proto_cdc_dcmd);
132 do { 130 do {
133 ret = drvr->bus_if->brcmf_bus_rxctl(drvr->dev, 131 ret = brcmf_bus_rxctl(drvr->bus_if, (unsigned char *)&prot->msg,
134 (unsigned char *)&prot->msg, 132 len);
135 len + sizeof(struct brcmf_proto_cdc_dcmd));
136 if (ret < 0) 133 if (ret < 0)
137 break; 134 break;
138 } while (CDC_DCMD_ID(le32_to_cpu(prot->msg.flags)) != id); 135 } while (CDC_DCMD_ID(le32_to_cpu(prot->msg.flags)) != id);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
index 7e58e8ce9aba..57671eddf79d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c
@@ -20,6 +20,7 @@
20#include <brcmu_wifi.h> 20#include <brcmu_wifi.h>
21#include <brcmu_utils.h> 21#include <brcmu_utils.h>
22#include "dhd.h" 22#include "dhd.h"
23#include "dhd_bus.h"
23#include "dhd_dbg.h" 24#include "dhd_dbg.h"
24 25
25static struct dentry *root_folder; 26static struct dentry *root_folder;
@@ -42,10 +43,12 @@ void brcmf_debugfs_exit(void)
42 43
43int brcmf_debugfs_attach(struct brcmf_pub *drvr) 44int brcmf_debugfs_attach(struct brcmf_pub *drvr)
44{ 45{
46 struct device *dev = drvr->bus_if->dev;
47
45 if (!root_folder) 48 if (!root_folder)
46 return -ENODEV; 49 return -ENODEV;
47 50
48 drvr->dbgfs_dir = debugfs_create_dir(dev_name(drvr->dev), root_folder); 51 drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
49 return PTR_RET(drvr->dbgfs_dir); 52 return PTR_RET(drvr->dbgfs_dir);
50} 53}
51 54
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index b6c86b046c15..421b49c95fb0 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -219,7 +219,7 @@ static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev)
219 brcmf_proto_hdrpush(drvr, ifp->idx, skb); 219 brcmf_proto_hdrpush(drvr, ifp->idx, skb);
220 220
221 /* Use bus module to send data frame */ 221 /* Use bus module to send data frame */
222 ret = drvr->bus_if->brcmf_bus_txdata(drvr->dev, skb); 222 ret = brcmf_bus_txdata(drvr->bus_if, skb);
223 223
224done: 224done:
225 if (ret) 225 if (ret)
@@ -397,7 +397,7 @@ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
397 397
398 sprintf(info->driver, KBUILD_MODNAME); 398 sprintf(info->driver, KBUILD_MODNAME);
399 sprintf(info->version, "%lu", drvr->drv_version); 399 sprintf(info->version, "%lu", drvr->drv_version);
400 sprintf(info->bus_info, "%s", dev_name(drvr->dev)); 400 sprintf(info->bus_info, "%s", dev_name(drvr->bus_if->dev));
401} 401}
402 402
403static const struct ethtool_ops brcmf_ethtool_ops = { 403static const struct ethtool_ops brcmf_ethtool_ops = {
@@ -753,7 +753,6 @@ int brcmf_attach(uint bus_hdrlen, struct device *dev)
753 drvr->hdrlen = bus_hdrlen; 753 drvr->hdrlen = bus_hdrlen;
754 drvr->bus_if = dev_get_drvdata(dev); 754 drvr->bus_if = dev_get_drvdata(dev);
755 drvr->bus_if->drvr = drvr; 755 drvr->bus_if->drvr = drvr;
756 drvr->dev = dev;
757 756
758 /* create device debugfs folder */ 757 /* create device debugfs folder */
759 brcmf_debugfs_attach(drvr); 758 brcmf_debugfs_attach(drvr);
@@ -790,7 +789,7 @@ int brcmf_bus_start(struct device *dev)
790 brcmf_dbg(TRACE, "\n"); 789 brcmf_dbg(TRACE, "\n");
791 790
792 /* Bring up the bus */ 791 /* Bring up the bus */
793 ret = bus_if->brcmf_bus_init(dev); 792 ret = brcmf_bus_init(bus_if);
794 if (ret != 0) { 793 if (ret != 0) {
795 brcmf_dbg(ERROR, "brcmf_sdbrcm_bus_init failed %d\n", ret); 794 brcmf_dbg(ERROR, "brcmf_sdbrcm_bus_init failed %d\n", ret);
796 return ret; 795 return ret;
@@ -809,7 +808,7 @@ int brcmf_bus_start(struct device *dev)
809 if (ret < 0) 808 if (ret < 0)
810 goto fail; 809 goto fail;
811 810
812 drvr->config = brcmf_cfg80211_attach(drvr); 811 drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev);
813 if (drvr->config == NULL) { 812 if (drvr->config == NULL) {
814 ret = -ENOMEM; 813 ret = -ENOMEM;
815 goto fail; 814 goto fail;
@@ -842,7 +841,7 @@ static void brcmf_bus_detach(struct brcmf_pub *drvr)
842 brcmf_proto_stop(drvr); 841 brcmf_proto_stop(drvr);
843 842
844 /* Stop the bus module */ 843 /* Stop the bus module */
845 drvr->bus_if->brcmf_bus_stop(drvr->dev); 844 brcmf_bus_stop(drvr->bus_if);
846 } 845 }
847} 846}
848 847
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 45725454714d..f2293bbb3c9b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -3883,6 +3883,14 @@ static void brcmf_sdbrcm_release(struct brcmf_sdio *bus)
3883 brcmf_dbg(TRACE, "Disconnected\n"); 3883 brcmf_dbg(TRACE, "Disconnected\n");
3884} 3884}
3885 3885
3886static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
3887 .stop = brcmf_sdbrcm_bus_stop,
3888 .init = brcmf_sdbrcm_bus_init,
3889 .txdata = brcmf_sdbrcm_bus_txdata,
3890 .txctl = brcmf_sdbrcm_bus_txctl,
3891 .rxctl = brcmf_sdbrcm_bus_rxctl,
3892};
3893
3886void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev) 3894void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
3887{ 3895{
3888 int ret; 3896 int ret;
@@ -3946,11 +3954,9 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
3946 spin_lock_init(&bus->dpc_tl_lock); 3954 spin_lock_init(&bus->dpc_tl_lock);
3947 3955
3948 /* Assign bus interface call back */ 3956 /* Assign bus interface call back */
3949 bus->sdiodev->bus_if->brcmf_bus_stop = brcmf_sdbrcm_bus_stop; 3957 bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
3950 bus->sdiodev->bus_if->brcmf_bus_init = brcmf_sdbrcm_bus_init; 3958 bus->sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
3951 bus->sdiodev->bus_if->brcmf_bus_txdata = brcmf_sdbrcm_bus_txdata; 3959
3952 bus->sdiodev->bus_if->brcmf_bus_txctl = brcmf_sdbrcm_bus_txctl;
3953 bus->sdiodev->bus_if->brcmf_bus_rxctl = brcmf_sdbrcm_bus_rxctl;
3954 /* Attach to the brcmf/OS/network interface */ 3960 /* Attach to the brcmf/OS/network interface */
3955 ret = brcmf_attach(SDPCM_RESERVE, bus->sdiodev->dev); 3961 ret = brcmf_attach(SDPCM_RESERVE, bus->sdiodev->dev);
3956 if (ret != 0) { 3962 if (ret != 0) {
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
index 39a5baa92f21..5eb7bf861848 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
@@ -1228,6 +1228,14 @@ error:
1228 return NULL; 1228 return NULL;
1229} 1229}
1230 1230
1231static struct brcmf_bus_ops brcmf_usb_bus_ops = {
1232 .txdata = brcmf_usb_tx,
1233 .init = brcmf_usb_up,
1234 .stop = brcmf_usb_down,
1235 .txctl = brcmf_usb_tx_ctlpkt,
1236 .rxctl = brcmf_usb_rx_ctlpkt,
1237};
1238
1231static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) 1239static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
1232{ 1240{
1233 struct brcmf_bus *bus = NULL; 1241 struct brcmf_bus *bus = NULL;
@@ -1246,14 +1254,11 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
1246 goto fail; 1254 goto fail;
1247 } 1255 }
1248 1256
1257 bus->dev = dev;
1249 bus_pub->bus = bus; 1258 bus_pub->bus = bus;
1250 bus->brcmf_bus_txdata = brcmf_usb_tx;
1251 bus->brcmf_bus_init = brcmf_usb_up;
1252 bus->brcmf_bus_stop = brcmf_usb_down;
1253 bus->brcmf_bus_txctl = brcmf_usb_tx_ctlpkt;
1254 bus->brcmf_bus_rxctl = brcmf_usb_rx_ctlpkt;
1255 bus->bus_priv.usb = bus_pub; 1259 bus->bus_priv.usb = bus_pub;
1256 dev_set_drvdata(dev, bus); 1260 dev_set_drvdata(dev, bus);
1261 bus->ops = &brcmf_usb_bus_ops;
1257 1262
1258 /* Attach to the common driver interface */ 1263 /* Attach to the common driver interface */
1259 ret = brcmf_attach(0, dev); 1264 ret = brcmf_attach(0, dev);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 96bc349d7f6c..4ddd58f1e9fe 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -4271,10 +4271,10 @@ static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
4271 brcmf_deinit_priv_mem(cfg); 4271 brcmf_deinit_priv_mem(cfg);
4272} 4272}
4273 4273
4274struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr) 4274struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
4275 struct device *busdev)
4275{ 4276{
4276 struct net_device *ndev = drvr->iflist[0]->ndev; 4277 struct net_device *ndev = drvr->iflist[0]->ndev;
4277 struct device *busdev = drvr->dev;
4278 struct brcmf_cfg80211_info *cfg; 4278 struct brcmf_cfg80211_info *cfg;
4279 struct wiphy *wiphy; 4279 struct wiphy *wiphy;
4280 struct brcmf_cfg80211_vif *vif; 4280 struct brcmf_cfg80211_vif *vif;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
index d60de187e7d9..c163e4dea972 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
@@ -450,7 +450,8 @@ brcmf_cfg80211_connect_info *cfg_to_conn(struct brcmf_cfg80211_info *cfg)
450 return &cfg->conn_info; 450 return &cfg->conn_info;
451} 451}
452 452
453struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr); 453struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
454 struct device *busdev);
454void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg); 455void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
455s32 brcmf_cfg80211_up(struct net_device *ndev); 456s32 brcmf_cfg80211_up(struct net_device *ndev);
456s32 brcmf_cfg80211_down(struct net_device *ndev); 457s32 brcmf_cfg80211_down(struct net_device *ndev);