/** * @brief This function sets multicast addresses to firmware * * @param dev A pointer to net_device structure * @return n/a */ static void wlan_set_multicast_list(struct eth_drv_sc *sc/*struct net_device *dev*/) { wlan_private *priv = (wlan_private *)sc->driver_private; wlan_adapter *Adapter = priv->adapter; int OldPacketFilter; #if 0 ENTER(); OldPacketFilter = Adapter->CurrentPacketFilter; if (dev->flags & IFF_PROMISC) { diag_printf("Enable Promiscuous mode\n"); Adapter->CurrentPacketFilter |= HostCmd_ACT_MAC_PROMISCUOUS_ENABLE; Adapter->CurrentPacketFilter &= ~(HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE | HostCmd_ACT_MAC_MULTICAST_ENABLE); } else { /* Multicast */ Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE; if (dev->flags & IFF_ALLMULTI || dev->mc_count > MRVDRV_MAX_MULTICAST_LIST_SIZE) { diag_printf("Enabling All Multicast!\n"); Adapter->CurrentPacketFilter |= HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE; Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_MULTICAST_ENABLE; } else { Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE; if (!dev->mc_count) { diag_printf("No multicast addresses - " "disabling multicast!\n"); Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_MULTICAST_ENABLE; } else { int i; Adapter->CurrentPacketFilter |= HostCmd_ACT_MAC_MULTICAST_ENABLE; Adapter->NumOfMulticastMACAddr = CopyMulticastAddrs(Adapter, dev); diag_printf("Multicast addresses: %d\n", dev->mc_count); for (i = 0; i < dev->mc_count; i++) { diag_printf("Multicast address %d:" "%x %x %x %x %x %x\n", i, Adapter->MulticastList[i][0], Adapter->MulticastList[i][1], Adapter->MulticastList[i][2], Adapter->MulticastList[i][3], Adapter->MulticastList[i][4], Adapter->MulticastList[i][5]); } /* set multicast addresses to firmware */ PrepareAndSendCommand(priv, HostCmd_CMD_MAC_MULTICAST_ADR, HostCmd_ACT_GEN_SET, 0, 0, NULL); } } } if (Adapter->CurrentPacketFilter != OldPacketFilter) { SetMacPacketFilter(priv); } LEAVE(); #endif }
/** * @brief This function downloads firmware image, gets * HW spec from firmware and set basic parameters to * firmware. * * @param priv A pointer to wlan_private structure * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE */ int wlan_setup_station_hw(wlan_private * priv) { int ret = WLAN_STATUS_SUCCESS; wlan_adapter *adapter = priv->adapter; struct net_device *dev = priv->wlan_dev.netdev; ENTER(); if (netif_running(dev)) netif_device_detach(dev); sbi_disable_host_int(priv); /* Download the helper */ ret = sbi_prog_helper(priv); if (ret) { PRINTM(INFO, "Bootloader in invalid state!\n"); ret = WLAN_STATUS_FAILURE; goto done; } /* Download the main firmware via the helper firmware */ if (sbi_prog_firmware_w_helper(priv)) { PRINTM(INFO, "Wlan FW download failed!\n"); ret = WLAN_STATUS_FAILURE; goto done; } /* check if the fimware is downloaded successfully or not */ if (sbi_verify_fw_download(priv)) { PRINTM(INFO, "FW failed to be active in time!\n"); ret = WLAN_STATUS_FAILURE; goto done; } priv->adapter->fwstate = FW_STATE_READY; if (netif_running(dev)) netif_device_attach(dev); #define RF_REG_OFFSET 0x07 #define RF_REG_VALUE 0xc8 sbi_enable_host_int(priv); #ifdef MFG_CMD_SUPPORT if (mfgmode == 0) { #endif /* * Read MAC address from HW */ memset(adapter->CurrentAddr, 0xff, MRVDRV_ETH_ADDR_LEN); ret = PrepareAndSendCommand(priv, HostCmd_CMD_GET_HW_SPEC, 0, HostCmd_OPTION_WAITFORRSP, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } SetMacPacketFilter(priv); ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_FW_WAKEUP_METHOD, HostCmd_ACT_GET, HostCmd_OPTION_WAITFORRSP, 0, &priv->adapter->fwWakeupMethod); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } #ifdef MFG_CMD_SUPPORT } #endif #ifdef MFG_CMD_SUPPORT if (mfgmode == 0) { #endif ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_RATE_ADAPT_RATESET, HostCmd_ACT_GEN_GET, HostCmd_OPTION_WAITFORRSP, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } priv->adapter->DataRate = 0; ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_RF_TX_POWER, HostCmd_ACT_GEN_GET, HostCmd_OPTION_WAITFORRSP, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } #ifdef MFG_CMD_SUPPORT } #endif ret = WLAN_STATUS_SUCCESS; done: LEAVE(); return (ret); }