bxe: properly get the maddr from the netif.
[akaros.git] / kern / drivers / net / bxe / bxe.c
index 2499a29..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,
@@ -12481,18 +12485,20 @@ bxe_initial_phy_init(struct bxe_adapter *sc,
     return (rc);
 }
 
-/* must be called under IF_ADDR_LOCK */
+/* must be called with sc locked. We don't need finer grained locking,
+ * I think, because adding addresses is not that frequent.
+ */
 static int
 bxe_init_mcast_macs_list(struct bxe_adapter                 *sc,
                          struct ecore_mcast_ramrod_params *p)
 {
     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;
@@ -12501,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);
 
@@ -12534,7 +12528,6 @@ bxe_init_mcast_macs_list(struct bxe_adapter                 *sc,
     }
 
     p->mcast_list_len = mc_count;
-    kfree(mta); //, M_DEVBUF);
 
     return (0);
 }
@@ -12549,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);
     }
 }
 
@@ -12602,21 +12595,13 @@ bxe_set_uc_list(struct bxe_adapter *sc)
     unsigned long ramrod_flags = 0;
     int rc;
 
-#if __FreeBSD_version < 800000
-    IF_ADDR_LOCK(ifp);
-#else
-    if_addr_rlock(ifp);
-#endif
-
+       they used to lock the ifp. We could do that.
+       just lock the sc here. I see no reason to get finer grained for this one.
     /* first schedule a cleanup up of old configuration */
     rc = bxe_del_all_macs(sc, mac_obj, ECORE_UC_LIST_MAC, FALSE);
     if (rc < 0) {
+unlock ehre.
         BLOGE(sc, "Failed to schedule delete of all ETH MACs (%d)\n", rc);
-#if __FreeBSD_version < 800000
-        IF_ADDR_UNLOCK(ifp);
-#else
-        if_addr_runlock(ifp);
-#endif
         return (rc);
     }
 
@@ -12635,22 +12620,14 @@ bxe_set_uc_list(struct bxe_adapter *sc)
             rc = 0;
         } else if (rc < 0) {
             BLOGE(sc, "Failed to schedule ADD operations (%d)\n", rc);
-#if __FreeBSD_version < 800000
-            IF_ADDR_UNLOCK(ifp);
-#else
-            if_addr_runlock(ifp);
-#endif
+unlock ehre.
             return (rc);
         }
 
         ifa = TAILQ_NEXT(ifa, ifa_link);
     }
 
-#if __FreeBSD_version < 800000
-    IF_ADDR_UNLOCK(ifp);
-#else
-    if_addr_runlock(ifp);
-#endif
+unlock here.
 
     /* Execute the pending commands */
     __set_bit(RAMROD_CONT, &ramrod_flags);
@@ -12676,7 +12653,6 @@ bxe_handle_rx_mode_tq(void *context,
     }
 
     BLOGD(sc, DBG_SP, "if_flags(ifp)=0x%x\n", if_getflags(sc->ifp));
-#warning "FIX ALL FLAGS"
 #if 0
     if (if_getflags(ifp) & IFF_PROMISC) {
         rx_mode = BXE_RX_MODE_PROMISC;
@@ -12771,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)) {
@@ -12781,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;
@@ -12793,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. */
@@ -12858,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 */
@@ -13100,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)) {
@@ -15074,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 */
     /*************/
@@ -16406,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),