2 * Copyright (c) 2010 Broadcom Corporation
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 /* The level of bus communication with the dongle */
21 enum brcmf_bus_state {
22 BRCMF_BUS_DOWN, /* Not ready for frame transfers */
23 BRCMF_BUS_LOAD, /* Download access only (CPU reset) */
24 BRCMF_BUS_DATA /* Ready for frame transfers */
28 unsigned long rx_packets; /* total packets received */
29 unsigned long tx_packets; /* total packets transmitted */
30 unsigned long rx_bytes; /* total bytes received */
31 unsigned long tx_bytes; /* total bytes transmitted */
32 unsigned long rx_errors; /* bad packets received */
33 unsigned long tx_errors; /* packet transmit problems */
34 unsigned long rx_dropped; /* packets dropped by dongle */
35 unsigned long tx_dropped; /* packets dropped by dongle */
36 unsigned long multicast; /* multicast packets received */
39 struct brcmf_bus_dcmd {
43 struct list_head list;
47 * struct brcmf_bus_ops - bus callback operations.
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.
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.
59 struct 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);
68 * struct brcmf_bus - interface structure between common and bus layer
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.
83 struct brcmf_sdio_dev *sdio;
84 struct brcmf_usbdev *usb;
87 struct brcmf_pub *drvr;
88 enum brcmf_bus_state state;
91 unsigned long tx_realloc;
92 struct dngl_stats dstats;
94 struct list_head dcmd_list;
96 struct brcmf_bus_ops *ops;
102 static inline int brcmf_bus_init(struct brcmf_bus *bus)
104 return bus->ops->init(bus->dev);
107 static inline void brcmf_bus_stop(struct brcmf_bus *bus)
109 bus->ops->stop(bus->dev);
112 static inline int brcmf_bus_txdata(struct brcmf_bus *bus, struct sk_buff *skb)
114 return bus->ops->txdata(bus->dev, skb);
118 int brcmf_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
120 return bus->ops->txctl(bus->dev, msg, len);
124 int brcmf_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
126 return bus->ops->rxctl(bus->dev, msg, len);
130 * interface functions from common layer
133 /* Remove any protocol-specific data header. */
134 extern int brcmf_proto_hdrpull(struct device *dev, int *ifidx,
135 struct sk_buff *rxp);
137 extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
138 struct sk_buff *pkt, int prec);
140 /* Receive frame for delivery to OS. Callee disposes of rxp. */
141 extern void brcmf_rx_frame(struct device *dev, u8 ifidx,
142 struct sk_buff_head *rxlist);
143 static inline void brcmf_rx_packet(struct device *dev, int ifidx,
146 struct sk_buff_head q;
148 skb_queue_head_init(&q);
149 skb_queue_tail(&q, pkt);
150 brcmf_rx_frame(dev, ifidx, &q);
153 /* Indication from bus module regarding presence/insertion of dongle. */
154 extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
155 /* Indication from bus module regarding removal/absence of dongle */
156 extern void brcmf_detach(struct device *dev);
158 /* Indication from bus module to change flow-control state */
159 extern void brcmf_txflowblock(struct device *dev, bool state);
161 /* Notify tx completion */
162 extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,
165 extern int brcmf_bus_start(struct device *dev);
167 #ifdef CONFIG_BRCMFMAC_SDIO
168 extern void brcmf_sdio_exit(void);
169 extern void brcmf_sdio_init(void);
171 #ifdef CONFIG_BRCMFMAC_USB
172 extern void brcmf_usb_exit(void);
173 extern void brcmf_usb_init(void);
176 #endif /* _BRCMF_BUS_H_ */