linux/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2010 Broadcom Corporation
   3 *
   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.
   7 *
   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.
  15 */
  16
  17#ifndef _BRCMF_BUS_H_
  18#define _BRCMF_BUS_H_
  19
  20/* The level of bus communication with the dongle */
  21enum 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 */
  25};
  26
  27struct brcmf_bus_dcmd {
  28        char *name;
  29        char *param;
  30        int param_len;
  31        struct list_head list;
  32};
  33
  34/**
  35 * struct brcmf_bus_ops - bus callback operations.
  36 *
  37 * @init: prepare for communication with dongle.
  38 * @stop: clear pending frames, disable data flow.
  39 * @txdata: send a data frame to the dongle (callee disposes skb).
  40 * @txctl: transmit a control request message to dongle.
  41 * @rxctl: receive a control response message from dongle.
  42 * @gettxq: obtain a reference of bus transmit queue (optional).
  43 *
  44 * This structure provides an abstract interface towards the
  45 * bus specific driver. For control messages to common driver
  46 * will assure there is only one active transaction. Unless
  47 * indicated otherwise these callbacks are mandatory.
  48 */
  49struct brcmf_bus_ops {
  50        int (*init)(struct device *dev);
  51        void (*stop)(struct device *dev);
  52        int (*txdata)(struct device *dev, struct sk_buff *skb);
  53        int (*txctl)(struct device *dev, unsigned char *msg, uint len);
  54        int (*rxctl)(struct device *dev, unsigned char *msg, uint len);
  55        struct pktq * (*gettxq)(struct device *dev);
  56};
  57
  58/**
  59 * struct brcmf_bus - interface structure between common and bus layer
  60 *
  61 * @bus_priv: pointer to private bus device.
  62 * @dev: device pointer of bus device.
  63 * @drvr: public driver information.
  64 * @state: operational state of the bus interface.
  65 * @maxctl: maximum size for rxctl request message.
  66 * @tx_realloc: number of tx packets realloced for headroom.
  67 * @dstats: dongle-based statistical data.
  68 * @align: alignment requirement for the bus.
  69 * @dcmd_list: bus/device specific dongle initialization commands.
  70 * @chip: device identifier of the dongle chip.
  71 * @chiprev: revision of the dongle chip.
  72 */
  73struct brcmf_bus {
  74        union {
  75                struct brcmf_sdio_dev *sdio;
  76                struct brcmf_usbdev *usb;
  77        } bus_priv;
  78        struct device *dev;
  79        struct brcmf_pub *drvr;
  80        enum brcmf_bus_state state;
  81        uint maxctl;
  82        unsigned long tx_realloc;
  83        u8 align;
  84        u32 chip;
  85        u32 chiprev;
  86        struct list_head dcmd_list;
  87
  88        struct brcmf_bus_ops *ops;
  89};
  90
  91/*
  92 * callback wrappers
  93 */
  94static inline int brcmf_bus_init(struct brcmf_bus *bus)
  95{
  96        return bus->ops->init(bus->dev);
  97}
  98
  99static inline void brcmf_bus_stop(struct brcmf_bus *bus)
 100{
 101        bus->ops->stop(bus->dev);
 102}
 103
 104static inline int brcmf_bus_txdata(struct brcmf_bus *bus, struct sk_buff *skb)
 105{
 106        return bus->ops->txdata(bus->dev, skb);
 107}
 108
 109static inline
 110int brcmf_bus_txctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
 111{
 112        return bus->ops->txctl(bus->dev, msg, len);
 113}
 114
 115static inline
 116int brcmf_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
 117{
 118        return bus->ops->rxctl(bus->dev, msg, len);
 119}
 120
 121static inline
 122struct pktq *brcmf_bus_gettxq(struct brcmf_bus *bus)
 123{
 124        if (!bus->ops->gettxq)
 125                return ERR_PTR(-ENOENT);
 126
 127        return bus->ops->gettxq(bus->dev);
 128}
 129/*
 130 * interface functions from common layer
 131 */
 132
 133extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
 134                         struct sk_buff *pkt, int prec);
 135
 136/* Receive frame for delivery to OS.  Callee disposes of rxp. */
 137extern void brcmf_rx_frames(struct device *dev, struct sk_buff_head *rxlist);
 138
 139/* Indication from bus module regarding presence/insertion of dongle. */
 140extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
 141/* Indication from bus module regarding removal/absence of dongle */
 142extern void brcmf_detach(struct device *dev);
 143/* Indication from bus module that dongle should be reset */
 144extern void brcmf_dev_reset(struct device *dev);
 145/* Indication from bus module to change flow-control state */
 146extern void brcmf_txflowblock(struct device *dev, bool state);
 147
 148/* Notify the bus has transferred the tx packet to firmware */
 149extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,
 150                             bool success);
 151
 152extern int brcmf_bus_start(struct device *dev);
 153
 154#ifdef CONFIG_BRCMFMAC_SDIO
 155extern void brcmf_sdio_exit(void);
 156extern void brcmf_sdio_init(void);
 157#endif
 158#ifdef CONFIG_BRCMFMAC_USB
 159extern void brcmf_usb_exit(void);
 160extern void brcmf_usb_init(void);
 161#endif
 162
 163#endif                          /* _BRCMF_BUS_H_ */
 164