/* !! may be called with core in reset */
 void dma_detach(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
 
        brcms_dbg_dma(di->core, "%s:\n", di->name);
 
 
 void dma_rxinit(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
 
        brcms_dbg_dma(di->core, "%s:\n", di->name);
 
  */
 int dma_rx(struct dma_pub *pub, struct sk_buff_head *skb_list)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct sk_buff_head dma_frames;
        struct sk_buff *p, *next;
        uint len;
  */
 bool dma_rxfill(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct sk_buff *p;
        u16 rxin, rxout;
        u32 flags = 0;
 
 void dma_rxreclaim(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct sk_buff *p;
 
        brcms_dbg_dma(di->core, "%s:\n", di->name);
 /* get the address of the var in order to change later */
 unsigned long dma_getvar(struct dma_pub *pub, const char *name)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
 
        if (!strcmp(name, "&txavail"))
                return (unsigned long)&(di->dma.txavail);
 
 void dma_txinit(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        u32 control = D64_XC_XE;
 
        brcms_dbg_dma(di->core, "%s:\n", di->name);
 
 void dma_txsuspend(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
 
        brcms_dbg_dma(di->core, "%s:\n", di->name);
 
 
 void dma_txresume(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
 
        brcms_dbg_dma(di->core, "%s:\n", di->name);
 
 
 bool dma_txsuspended(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
 
        return (di->ntxd == 0) ||
               ((bcma_read32(di->core,
 
 void dma_txreclaim(struct dma_pub *pub, enum txd_range range)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct sk_buff *p;
 
        brcms_dbg_dma(di->core, "%s: %s\n",
 
 bool dma_txreset(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        u32 status;
 
        if (di->ntxd == 0)
 
 bool dma_rxreset(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        u32 status;
 
        if (di->nrxd == 0)
 int dma_txfast(struct brcms_c_info *wlc, struct dma_pub *pub,
               struct sk_buff *p)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct brcms_ampdu_session *session = &di->ampdu_session;
        struct ieee80211_tx_info *tx_info;
        bool is_ampdu;
 
 void dma_txflush(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct brcms_ampdu_session *session = &di->ampdu_session;
 
        if (!skb_queue_empty(&session->skb_list))
 
 int dma_txpending(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        return ntxdactive(di, di->txin, di->txout);
 }
 
  */
 void dma_kick_tx(struct dma_pub *pub)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        struct brcms_ampdu_session *session = &di->ampdu_session;
 
        if (!skb_queue_empty(&session->skb_list) && dma64_txidle(di))
  */
 struct sk_buff *dma_getnexttxp(struct dma_pub *pub, enum txd_range range)
 {
-       struct dma_info *di = (struct dma_info *)pub;
+       struct dma_info *di = container_of(pub, struct dma_info, dma);
        u16 start, end, i;
        u16 active_desc;
        struct sk_buff *txp;
 void dma_walk_packets(struct dma_pub *dmah, void (*callback_fnc)
                      (void *pkt, void *arg_a), void *arg_a)
 {
-       struct dma_info *di = (struct dma_info *) dmah;
+       struct dma_info *di = container_of(dmah, struct dma_info, dma);
        uint i =   di->txin;
        uint end = di->txout;
        struct sk_buff *skb;