bxe: properly get the maddr from the netif.
[akaros.git] / kern / drivers / net / bxe / bxe.c
index 8e0e234..c7290e3 100644 (file)
@@ -321,6 +321,8 @@ static int bxe_udp_rss = 0;
 //SYSCTL_INT(_hw_bxe, OID_AUTO, udp_rss, CTLFLAG_RDTUN,
 //           &bxe_udp_rss, 0, "UDP RSS support");
 
+static int bxe_periodic_alarm = 60;
+
 #define STAT_NAME_LEN 32 /* no stat names below can be longer than this */
 
 #define STATS_OFFSET32(stat_name)                   \
@@ -660,7 +662,9 @@ static inline void bxe_update_rx_prod(struct bxe_adapter    *sc,
 static void    bxe_link_report_locked(struct bxe_adapter *sc);
 static void    bxe_link_report(struct bxe_adapter *sc);
 static void    bxe_link_status_update(struct bxe_adapter *sc);
-static void    bxe_periodic_callout_func(void *xsc);
+static void    bxe__alarm_handler(struct alarm_waiter *waiter,
+                                 struct hw_trapframe *hw_tf);
+
 static void    bxe_periodic_start(struct bxe_adapter *sc);
 static void    bxe_periodic_stop(struct bxe_adapter *sc);
 static int     bxe_alloc_rx_bd_mbuf(struct bxe_fastpath *fp,
@@ -12490,11 +12494,11 @@ bxe_init_mcast_macs_list(struct bxe_adapter                 *sc,
 {
     if_t ifp = sc->ifp;
     int mc_count = 0;
-    int mcnt, i;
+    int i;
     struct ecore_mcast_list_elem *mc_mac;
     unsigned char *mta;
 
-    mc_count = if_multiaddr_count(ifp, -1);/* XXX they don't have a limit */
+    mc_count = ifp->nmaddr;
                                            /* should we enforce one? */
     ECORE_LIST_INIT(&p->mcast_list);
     p->mcast_list_len = 0;
@@ -12503,27 +12507,15 @@ bxe_init_mcast_macs_list(struct bxe_adapter                 *sc,
         return (0);
     }
 
-    mta = kmalloc(sizeof(unsigned char) * ETH_ADDR_LEN * mc_count,
-                     0); //M_DEVBUF, M_NOWAIT);
-    mta = NULL;
-
-    if(mta == NULL) {
-        BLOGE(sc, "Failed to allocate temp mcast list\n");
-        return (-1);
-    }
+    mta = ifp->maddr;
     
-    mc_mac = kzmalloc(sizeof(*mc_mac) * mc_count, 0); //M_DEVBUF,
+    mc_mac = kzmalloc(sizeof(*mc_mac) * mc_count, KMALLOC_WAIT);
     if (!mc_mac) {
-        kfree(mta); //, M_DEVBUF);
         BLOGE(sc, "Failed to allocate temp mcast list\n");
         return (-1);
     }
 
-    // BSD thing
-    //    if_multiaddr_array(ifp, mta, &mcnt, mc_count); /* mta and mcnt not expected 
-    //                                   to be  different */
-    for(i=0; i< mcnt; i++) {
-
+    for(i=0; i< mc_count; i++) {
         bcopy((mta + (i * ETH_ADDR_LEN)), mc_mac->mac, ETH_ADDR_LEN);
         ECORE_LIST_PUSH_TAIL(&mc_mac->link, &p->mcast_list);
 
@@ -12536,7 +12528,6 @@ bxe_init_mcast_macs_list(struct bxe_adapter                 *sc,
     }
 
     p->mcast_list_len = mc_count;
-    kfree(mta); //, M_DEVBUF);
 
     return (0);
 }
@@ -12551,7 +12542,7 @@ bxe_free_mcast_macs_list(struct ecore_mcast_ramrod_params *p)
 
     if (mc_mac) {
         /* only a single free as all mc_macs are in the same heap array */
-      kfree(mc_mac); //, M_DEVBUF);
+      kfree(mc_mac);
     }
 }
 
@@ -12756,9 +12747,12 @@ bxe_update_drv_flags(struct bxe_adapter *sc,
 /* periodic timer callout routine, only runs when the interface is up */
 
 static void
-bxe_periodic_callout_func(void *xsc)
+bxe_alarm_handler(struct alarm_waiter *waiter,
+                                struct hw_trapframe *hw_tf)
 {
-    struct bxe_adapter *sc = (struct bxe_adapter *)xsc;
+       struct timer_chain *tchain = &per_cpu_info[0].tchain;
+
+       struct bxe_adapter *sc = (struct bxe_adapter *) waiter->data;
     int i;
 
     if (!BXE_CORE_TRYLOCK(sc)) {
@@ -12766,9 +12760,8 @@ bxe_periodic_callout_func(void *xsc)
 
         if ((sc->state == BXE_STATE_OPEN) &&
             (atomic_read(&sc->periodic_flags) == PERIODIC_GO)) {
-            /* schedule the next periodic callout */
-               //callout_reset(&sc->periodic_callout, hz,
-               //        bxe_periodic_callout_func, sc);
+               goto done;
+
         }
 
         return;
@@ -12778,7 +12771,7 @@ bxe_periodic_callout_func(void *xsc)
         (atomic_read(&sc->periodic_flags) == PERIODIC_STOP)) {
         BLOGW(sc, "periodic callout exit (state=0x%x)\n", sc->state);
         BXE_CORE_UNLOCK(sc);
-        return;
+       goto done;
     }
 
     /* Check for TX timeouts on any fastpath. */
@@ -12843,24 +12836,31 @@ bxe_periodic_callout_func(void *xsc)
 
     if ((sc->state == BXE_STATE_OPEN) &&
         (atomic_read(&sc->periodic_flags) == PERIODIC_GO)) {
-        /* schedule the next periodic callout */
-//        callout_reset(&sc->periodic_callout, hz,
-//                      bxe_periodic_callout_func, sc);
+           goto done;
     }
+    // we're not restarting it. That's how it ends.
+    return;
+    /* schedule the next periodic callout */
+done:
+    __reset_alarm_rel(tchain, waiter, bxe_periodic_alarm);
 }
 
 static void
 bxe_periodic_start(struct bxe_adapter *sc)
 {
-       //atomic_set(&sc->periodic_flags, PERIODIC_GO);
-    //  callout_reset(&sc->periodic_callout, hz, bxe_periodic_callout_func, sc);
+       struct timer_chain *tchain = &per_cpu_info[0].tchain;
+
+       if (! sc->waiter) {
+               sc->waiter = kzmalloc(sizeof(struct alarm_waiter), KMALLOC_WAIT);
+               init_awaiter_irq(sc->waiter, bxe_alarm_handler);
+       }
+       reset_alarm_rel(tchain, sc->waiter, bxe_periodic_alarm);
 }
 
 static void
 bxe_periodic_stop(struct bxe_adapter *sc)
 {
-//    atomic_set(&sc->periodic_flags, PERIODIC_STOP);
-//    callout_drain(&sc->periodic_callout);
+       atomic_set(&sc->periodic_flags, PERIODIC_STOP);
 }
 
 /* start the controller */
@@ -13085,7 +13085,7 @@ bxe_nic_load(struct bxe_adapter *sc,
         bxe_link_status_update(sc);
     }
 
-    /* start the periodic timer callout */
+    /* start the periodic timer alarm */
     bxe_periodic_start(sc);
 
     if (IS_PF(sc) && SHMEM2_HAS(sc, drv_capabilities_flag)) {
@@ -15059,27 +15059,9 @@ bxe_alloc_hsi_mem(struct bxe_adapter *sc)
         return (1);
     }
 
-#warning "what the hell is gz_strm"
-#if 0
+       // The compress/decompress shit never worked. But they use the buffer. */
     sc->gz_buf = (void *)sc->gz_buf_dma.vaddr;
 
-    if ((sc->gz_strm =
-         kmalloc(sizeof(*sc->gz_strm), /*M_DEVBUF,*/ M_NOWAIT)) == NULL) {
-        /* XXX */
-        bxe_dma_free(sc, &sc->gz_buf_dma);
-        sc->gz_buf = NULL;
-        bxe_dma_free(sc, &sc->spq_dma);
-        sc->spq = NULL;
-        bxe_dma_free(sc, &sc->sp_dma);
-        sc->sp = NULL;
-        bxe_dma_free(sc, &sc->eq_dma);
-        sc->eq = NULL;
-        bxe_dma_free(sc, &sc->def_sb_dma);
-        sc->def_sb = NULL;
-        bus_dma_tag_destroy(sc->parent_dma_tag);
-        return (1);
-    }
-#endif
     /*************/
     /* FASTPATHS */
     /*************/
@@ -16391,9 +16373,6 @@ bxe_attach(device_t dev)
     /* initialize the mutexes */
     bxe_init_mutexes(sc);
 
-    /* prepare the periodic callout */
-    callout_init(&sc->periodic_callout, 0);
-
     /* prepare the chip taskqueue */
     sc->chip_tq_flags = CHIP_TQ_NONE;
     snprintf(sc->chip_tq_name, sizeof(sc->chip_tq_name),