#include <linux/fs.h>
#include <linux/uaccess.h>
#include <bcmdefs.h>
-#include <osl.h>
#include <bcmutils.h>
-#include <bcmendian.h>
-#include <proto/ethernet.h>
#include <dngl_stats.h>
#include <dhd.h>
#include <dhd_bus.h>
#include <wl_cfg80211.h>
-#define EPI_VERSION_STR "4.218.248.5"
+#define EPI_VERSION_STR "4.218.248.5"
+#define ETH_P_BRCM 0x886c
#if defined(CUSTOMER_HW2) && defined(CONFIG_WIFI_CONTROL_FUNC)
#include <linux/wifi_tiwlan.h>
.suspend = wifi_suspend,
.resume = wifi_resume,
.driver = {
- .name = "bcm4329_wlan",
+ .name = KBUILD_MODNAME,
}
};
struct semaphore sysioc_sem;
bool set_multicast;
bool set_macaddress;
- struct ether_addr macvalue;
+ u8 macvalue[ETH_ALEN];
wait_queue_head_t ctrl_wait;
atomic_t pend_8021x_cnt;
#define DHD_COMPILED
#endif
-static char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR
-#ifdef DHD_DEBUG
-"\nCompiled in " " on " __DATE__ " at " __TIME__
-#endif
-;
-
#if defined(CONFIG_WIRELESS_EXT)
struct iw_statistics *dhd_get_wireless_stats(struct net_device *dev);
#endif /* defined(CONFIG_WIRELESS_EXT) */
dhd_set_packet_filter(1, dhd);
/* if dtim skip setup as default force it
- * to wake each thrid dtim
+ * to wake each third dtim
* for better power saving.
* Note that side effect is chance to miss BC/MC
* packet
strcpy(bufp, "mcast_list");
bufp += strlen("mcast_list") + 1;
- cnt = htol32(cnt);
+ cnt = cpu_to_le32(cnt);
memcpy(bufp, &cnt, sizeof(cnt));
bufp += sizeof(cnt);
dhd_ifname(&dhd->pub, ifidx)));
return;
}
- allmulti = htol32(allmulti);
+ allmulti = cpu_to_le32(allmulti);
if (!bcm_mkiovar
("allmulti", (void *)&allmulti, sizeof(allmulti), buf, buflen)) {
ret = dhd_prot_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len);
if (ret < 0) {
DHD_ERROR(("%s: set allmulti %d failed\n",
- dhd_ifname(&dhd->pub, ifidx), ltoh32(allmulti)));
+ dhd_ifname(&dhd->pub, ifidx),
+ le32_to_cpu(allmulti)));
}
kfree(buf);
driver does */
allmulti = (dev->flags & IFF_PROMISC) ? true : false;
- allmulti = htol32(allmulti);
+ allmulti = cpu_to_le32(allmulti);
memset(&ioc, 0, sizeof(ioc));
ioc.cmd = WLC_SET_PROMISC;
ret = dhd_prot_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len);
if (ret < 0) {
DHD_ERROR(("%s: set promisc %d failed\n",
- dhd_ifname(&dhd->pub, ifidx), ltoh32(allmulti)));
+ dhd_ifname(&dhd->pub, ifidx),
+ le32_to_cpu(allmulti)));
}
}
static int
-_dhd_set_mac_address(dhd_info_t *dhd, int ifidx, struct ether_addr *addr)
+_dhd_set_mac_address(dhd_info_t *dhd, int ifidx, u8 *addr)
{
char buf[32];
wl_ioctl_t ioc;
if (dhd->set_macaddress) {
dhd->set_macaddress = false;
_dhd_set_mac_address(dhd, i,
- &dhd->macvalue);
+ dhd->macvalue);
}
}
}
/* Update multicast statistic */
if (pktbuf->len >= ETH_ALEN) {
u8 *pktdata = (u8 *) (pktbuf->data);
- struct ether_header *eh = (struct ether_header *)pktdata;
+ struct ethhdr *eh = (struct ethhdr *)pktdata;
- if (is_multicast_ether_addr(eh->ether_dhost))
+ if (is_multicast_ether_addr(eh->h_dest))
dhdp->tx_multicast++;
- if (ntoh16(eh->ether_type) == ETH_P_PAE)
+ if (ntohs(eh->h_proto) == ETH_P_PAE)
atomic_inc(&dhd->pend_8021x_cnt);
}
#ifdef BCMDBUS
ret = dbus_send_pkt(dhdp->dbus, pktbuf, NULL /* pktinfo */);
#else
- WAKE_LOCK_TIMEOUT(dhdp, WAKE_LOCK_TMOUT, 25);
ret = dhd_bus_txdata(dhdp->bus, pktbuf);
#endif /* BCMDBUS */
}
static inline void *
-osl_pkt_frmnative(struct osl_info *osh, struct sk_buff *skb)
+osl_pkt_frmnative(struct sk_buff *skb)
{
- struct sk_buff *nskb;
-
- for (nskb = skb; nskb; nskb = nskb->next)
- osh->pktalloced++;
-
return (void *)skb;
}
#define PKTFRMNATIVE(osh, skb) \
- osl_pkt_frmnative((osh), (struct sk_buff *)(skb))
+ osl_pkt_frmnative((struct sk_buff *)(skb))
static inline struct sk_buff *
-osl_pkt_tonative(struct osl_info *osh, void *pkt)
+osl_pkt_tonative(void *pkt)
{
- struct sk_buff *nskb;
-
- for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next)
- osh->pktalloced--;
-
return (struct sk_buff *)pkt;
}
#define PKTTONATIVE(osh, pkt) \
- osl_pkt_tonative((osh), (pkt))
+ osl_pkt_tonative((pkt))
static int dhd_start_xmit(struct sk_buff *skb, struct net_device *net)
{
skb_pull(skb, ETH_HLEN);
/* Process special event packets and then discard them */
- if (ntoh16(skb->protocol) == ETHER_TYPE_BRCM)
+ if (ntohs(skb->protocol) == ETH_P_BRCM)
dhd_wl_host_event(dhd, &ifidx,
skb_mac_header(skb),
&event, &data);
{
uint ifidx;
dhd_info_t *dhd = (dhd_info_t *) (dhdp->info);
- struct ether_header *eh;
+ struct ethhdr *eh;
u16 type;
dhd_prot_hdrpull(dhdp, &ifidx, txp);
- eh = (struct ether_header *)(txp->data);
- type = ntoh16(eh->ether_type);
+ eh = (struct ethhdr *)(txp->data);
+ type = ntohs(eh->h_proto);
if (type == ETH_P_PAE)
atomic_dec(&dhd->pend_8021x_cnt);
static int dhd_watchdog_thread(void *data)
{
dhd_info_t *dhd = (dhd_info_t *) data;
- WAKE_LOCK_INIT(&dhd->pub, WAKE_LOCK_WATCHDOG, "dhd_watchdog_thread");
/* This thread doesn't need any user-level access,
* so get rid of all our resources
break;
if (down_interruptible(&dhd->watchdog_sem) == 0) {
if (dhd->pub.dongle_reset == false) {
- WAKE_LOCK(&dhd->pub, WAKE_LOCK_WATCHDOG);
/* Call the bus module watchdog */
dhd_bus_watchdog(&dhd->pub);
- WAKE_UNLOCK(&dhd->pub, WAKE_LOCK_WATCHDOG);
}
/* Count the tick for reference */
dhd->pub.tickcnt++;
} else
break;
}
-
- WAKE_LOCK_DESTROY(&dhd->pub, WAKE_LOCK_WATCHDOG);
return 0;
}
{
dhd_info_t *dhd = (dhd_info_t *) data;
- WAKE_LOCK_INIT(&dhd->pub, WAKE_LOCK_DPC, "dhd_dpc_thread");
/* This thread doesn't need any user-level access,
* so get rid of all our resources
*/
/* Call bus dpc unless it indicated down
(then clean stop) */
if (dhd->pub.busstate != DHD_BUS_DOWN) {
- WAKE_LOCK(&dhd->pub, WAKE_LOCK_DPC);
if (dhd_bus_dpc(dhd->pub.bus)) {
up(&dhd->dpc_sem);
- WAKE_LOCK_TIMEOUT(&dhd->pub,
- WAKE_LOCK_TMOUT, 25);
}
- WAKE_UNLOCK(&dhd->pub, WAKE_LOCK_DPC);
} else {
dhd_bus_stop(dhd->pub.bus, true);
}
} else
break;
}
-
- WAKE_LOCK_DESTROY(&dhd->pub, WAKE_LOCK_DPC);
return 0;
}
}
static s16 linuxbcmerrormap[] = { 0, /* 0 */
- -EINVAL, /* BCME_ERROR */
- -EINVAL, /* BCME_BADARG */
- -EINVAL, /* BCME_BADOPTION */
- -EINVAL, /* BCME_NOTUP */
- -EINVAL, /* BCME_NOTDOWN */
- -EINVAL, /* BCME_NOTAP */
- -EINVAL, /* BCME_NOTSTA */
- -EINVAL, /* BCME_BADKEYIDX */
- -EINVAL, /* BCME_RADIOOFF */
- -EINVAL, /* BCME_NOTBANDLOCKED */
- -EINVAL, /* BCME_NOCLK */
- -EINVAL, /* BCME_BADRATESET */
- -EINVAL, /* BCME_BADBAND */
- -E2BIG, /* BCME_BUFTOOSHORT */
- -E2BIG, /* BCME_BUFTOOLONG */
- -EBUSY, /* BCME_BUSY */
- -EINVAL, /* BCME_NOTASSOCIATED */
- -EINVAL, /* BCME_BADSSIDLEN */
- -EINVAL, /* BCME_OUTOFRANGECHAN */
- -EINVAL, /* BCME_BADCHAN */
- -EFAULT, /* BCME_BADADDR */
- -ENOMEM, /* BCME_NORESOURCE */
- -EOPNOTSUPP, /* BCME_UNSUPPORTED */
- -EMSGSIZE, /* BCME_BADLENGTH */
- -EINVAL, /* BCME_NOTREADY */
- -EPERM, /* BCME_NOTPERMITTED */
- -ENOMEM, /* BCME_NOMEM */
- -EINVAL, /* BCME_ASSOCIATED */
- -ERANGE, /* BCME_RANGE */
- -EINVAL, /* BCME_NOTFOUND */
- -EINVAL, /* BCME_WME_NOT_ENABLED */
- -EINVAL, /* BCME_TSPEC_NOTFOUND */
- -EINVAL, /* BCME_ACM_NOTSUPPORTED */
- -EINVAL, /* BCME_NOT_WME_ASSOCIATION */
- -EIO, /* BCME_SDIO_ERROR */
- -ENODEV, /* BCME_DONGLE_DOWN */
- -EINVAL, /* BCME_VERSION */
- -EIO, /* BCME_TXFAIL */
- -EIO, /* BCME_RXFAIL */
- -EINVAL, /* BCME_NODEVICE */
- -EINVAL, /* BCME_NMODE_DISABLED */
- -ENODATA, /* BCME_NONRESIDENT */
+ -EINVAL, /* -BCME_ERROR */
+ -EINVAL, /* -BCME_BADARG */
+ -EINVAL, /* -BCME_BADOPTION */
+ -EINVAL, /* -BCME_NOTUP */
+ -EINVAL, /* -BCME_NOTDOWN */
+ -EINVAL, /* -BCME_NOTAP */
+ -EINVAL, /* -BCME_NOTSTA */
+ -EINVAL, /* -BCME_BADKEYIDX */
+ -EINVAL, /* -BCME_RADIOOFF */
+ -EINVAL, /* -BCME_NOTBANDLOCKED */
+ -EINVAL, /* -BCME_NOCLK */
+ -EINVAL, /* -BCME_BADRATESET */
+ -EINVAL, /* -BCME_BADBAND */
+ -E2BIG, /* -BCME_BUFTOOSHORT */
+ -E2BIG, /* -BCME_BUFTOOLONG */
+ -EBUSY, /* -BCME_BUSY */
+ -EINVAL, /* -BCME_NOTASSOCIATED */
+ -EINVAL, /* -BCME_BADSSIDLEN */
+ -EINVAL, /* -BCME_OUTOFRANGECHAN */
+ -EINVAL, /* -BCME_BADCHAN */
+ -EFAULT, /* -BCME_BADADDR */
+ -ENOMEM, /* -BCME_NORESOURCE */
+ -EOPNOTSUPP, /* -BCME_UNSUPPORTED */
+ -EMSGSIZE, /* -BCME_BADLENGTH */
+ -EINVAL, /* -BCME_NOTREADY */
+ -EPERM, /* -BCME_NOTPERMITTED */
+ -ENOMEM, /* -BCME_NOMEM */
+ -EINVAL, /* -BCME_ASSOCIATED */
+ -ERANGE, /* -BCME_RANGE */
+ -EINVAL, /* -BCME_NOTFOUND */
+ -EINVAL, /* -BCME_WME_NOT_ENABLED */
+ -EINVAL, /* -BCME_TSPEC_NOTFOUND */
+ -EINVAL, /* -BCME_ACM_NOTSUPPORTED */
+ -EINVAL, /* -BCME_NOT_WME_ASSOCIATION */
+ -EIO, /* -BCME_SDIO_ERROR */
+ -ENODEV, /* -BCME_DONGLE_DOWN */
+ -EINVAL, /* -BCME_VERSION */
+ -EIO, /* -BCME_TXFAIL */
+ -EIO, /* -BCME_RXFAIL */
+ -EINVAL, /* -BCME_NODEVICE */
+ -EINVAL, /* -BCME_NMODE_DISABLED */
+ -ENODATA, /* -BCME_NONRESIDENT */
};
static int dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd)
/* Copy the ioc control structure part of ioctl request */
if (copy_from_user(&ioc, ifr->ifr_data, sizeof(wl_ioctl_t))) {
- bcmerror = -BCME_BADADDR;
+ bcmerror = BCME_BADADDR;
goto done;
}
{
buf = kmalloc(buflen, GFP_ATOMIC);
if (!buf) {
- bcmerror = -BCME_NOMEM;
+ bcmerror = BCME_NOMEM;
goto done;
}
if (copy_from_user(buf, ioc.buf, buflen)) {
- bcmerror = -BCME_BADADDR;
+ bcmerror = BCME_BADADDR;
goto done;
}
}
/* To differentiate between wl and dhd read 4 more byes */
if ((copy_from_user(&driver, (char *)ifr->ifr_data + sizeof(wl_ioctl_t),
sizeof(uint)) != 0)) {
- bcmerror = -BCME_BADADDR;
+ bcmerror = BCME_BADADDR;
goto done;
}
if (!capable(CAP_NET_ADMIN)) {
- bcmerror = -BCME_EPERM;
+ bcmerror = BCME_EPERM;
goto done;
}
/* send to dongle (must be up, and wl) */
if ((dhd->pub.busstate != DHD_BUS_DATA)) {
DHD_ERROR(("%s DONGLE_DOWN,__func__\n", __func__));
- bcmerror = BCME_DONGLE_DOWN;
+ bcmerror = -BCME_DONGLE_DOWN;
goto done;
}
if (!dhd->pub.iswl) {
- bcmerror = BCME_DONGLE_DOWN;
+ bcmerror = -BCME_DONGLE_DOWN;
goto done;
}
if (is_set_key_cmd)
dhd_wait_pend8021x(net);
- WAKE_LOCK_INIT(&dhd->pub, WAKE_LOCK_IOCTL, "dhd_ioctl_entry");
- WAKE_LOCK(&dhd->pub, WAKE_LOCK_IOCTL);
-
bcmerror =
dhd_prot_ioctl(&dhd->pub, ifidx, (wl_ioctl_t *)&ioc, buf, buflen);
- WAKE_UNLOCK(&dhd->pub, WAKE_LOCK_IOCTL);
- WAKE_LOCK_DESTROY(&dhd->pub, WAKE_LOCK_IOCTL);
done:
if (!bcmerror && buf && ioc.buf) {
if (copy_to_user(ioc.buf, buf, buflen))
bcmerror = -EFAULT;
}
- if (buf)
- kfree(buf);
+ kfree(buf);
if (bcmerror > 0)
bcmerror = 0;
- else if (bcmerror < BCME_LAST)
- bcmerror = BCME_ERROR;
+ else if (bcmerror < -BCME_LAST)
+ bcmerror = -BCME_ERROR;
return linuxbcmerrormap[-bcmerror];
}
}
atomic_set(&dhd->pend_8021x_cnt, 0);
- memcpy(net->dev_addr, dhd->pub.mac.octet, ETH_ALEN);
+ memcpy(net->dev_addr, dhd->pub.mac, ETH_ALEN);
#ifdef TOE
/* Get current TOE mode from dongle */
return ret;
}
-struct osl_info *dhd_osl_attach(void *pdev, uint bustype)
-{
- return osl_attach(pdev, bustype);
-}
-
-void dhd_osl_detach(struct osl_info *osh)
-{
- osl_detach(osh);
-}
-
int
dhd_add_if(dhd_info_t *dhd, int ifidx, void *handle, char *name,
u8 *mac_addr, u32 flags, u8 bssidx)
up(&dhd->sysioc_sem);
}
-dhd_pub_t *dhd_attach(struct osl_info *osh, struct dhd_bus *bus,
- uint bus_hdrlen)
+dhd_pub_t *dhd_attach(struct dhd_bus *bus, uint bus_hdrlen)
{
dhd_info_t *dhd = NULL;
struct net_device *net;
}
/* Allocate primary dhd_info */
- dhd = kmalloc(sizeof(dhd_info_t), GFP_ATOMIC);
+ dhd = kzalloc(sizeof(dhd_info_t), GFP_ATOMIC);
if (!dhd) {
DHD_ERROR(("%s: OOM - alloc dhd_info\n", __func__));
goto fail;
}
- memset(dhd, 0, sizeof(dhd_info_t));
-
/*
* Save the dhd_info into the priv
*/
memcpy(netdev_priv(net), &dhd, sizeof(dhd));
- dhd->pub.osh = osh;
/* Set network interface name if it was provided as module parameter */
if (iface_name[0]) {
#endif /* defined(CONFIG_PM_SLEEP) */
/* && defined(DHD_GPL) */
/* Init lock suspend to prevent kernel going to suspend */
- WAKE_LOCK_INIT(&dhd->pub, WAKE_LOCK_TMOUT, "dhd_wake_lock");
- WAKE_LOCK_INIT(&dhd->pub, WAKE_LOCK_LINK_DOWN_TMOUT,
- "dhd_wake_lock_link_dw_event");
- WAKE_LOCK_INIT(&dhd->pub, WAKE_LOCK_PNO_FIND_TMOUT,
- "dhd_wake_lock_link_pno_find_event");
#ifdef CONFIG_HAS_EARLYSUSPEND
dhd->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 20;
dhd->early_suspend.suspend = dhd_early_suspend;
/* try to download image and nvram to the dongle */
if (dhd->pub.busstate == DHD_BUS_DOWN) {
- WAKE_LOCK_INIT(dhdp, WAKE_LOCK_DOWNLOAD, "dhd_bus_start");
- WAKE_LOCK(dhdp, WAKE_LOCK_DOWNLOAD);
- if (!(dhd_bus_download_firmware(dhd->pub.bus, dhd->pub.osh,
+ if (!(dhd_bus_download_firmware(dhd->pub.bus,
fw_path, nv_path))) {
DHD_ERROR(("%s: dhdsdio_probe_download failed. "
"firmware = %s nvram = %s\n",
__func__, fw_path, nv_path));
- WAKE_UNLOCK(dhdp, WAKE_LOCK_DOWNLOAD);
- WAKE_LOCK_DESTROY(dhdp, WAKE_LOCK_DOWNLOAD);
return -1;
}
-
- WAKE_UNLOCK(dhdp, WAKE_LOCK_DOWNLOAD);
- WAKE_LOCK_DESTROY(dhdp, WAKE_LOCK_DOWNLOAD);
}
/* Start the watchdog timer */
bcm_mkiovar("event_msgs", dhdp->eventmask, WL_EVENTING_MASK_LEN, iovbuf,
sizeof(iovbuf));
dhdcdc_query_ioctl(dhdp, 0, WLC_GET_VAR, iovbuf, sizeof(iovbuf));
- bcopy(iovbuf, dhdp->eventmask, WL_EVENTING_MASK_LEN);
+ memcpy(dhdp->eventmask, iovbuf, WL_EVENTING_MASK_LEN);
setbit(dhdp->eventmask, WLC_E_SET_SSID);
setbit(dhdp->eventmask, WLC_E_PRUNE);
*/
if (ifidx != 0) {
/* for virtual interfaces use the primary MAC */
- memcpy(temp_addr, dhd->pub.mac.octet, ETH_ALEN);
+ memcpy(temp_addr, dhd->pub.mac, ETH_ALEN);
}
goto fail;
}
- printf("%s: Broadcom Dongle Host Driver\n", net->name);
+ DHD_INFO(("%s: Broadcom Dongle Host Driver\n", net->name));
return 0;
fail:
net->netdev_ops = NULL;
- return BCME_ERROR;
+ return -BCME_ERROR;
}
void dhd_bus_detach(dhd_pub_t *dhdp)
unregister_pm_notifier(&dhd_sleep_pm_notifier);
#endif /* defined(CONFIG_PM_SLEEP) */
/* && defined(DHD_GPL) */
- WAKE_LOCK_DESTROY(dhdp, WAKE_LOCK_TMOUT);
- WAKE_LOCK_DESTROY(dhdp, WAKE_LOCK_LINK_DOWN_TMOUT);
- WAKE_LOCK_DESTROY(dhdp, WAKE_LOCK_PNO_FIND_TMOUT);
free_netdev(ifp->net);
kfree(ifp);
kfree(dhd);
error = wifi_add_dev();
if (error) {
DHD_ERROR(("%s: platform_driver_register failed\n", __func__));
- goto faild;
+ goto failed;
}
/* Waiting callback after platform_driver_register is done or
__func__);
/* remove device */
wifi_del_dev();
- goto faild;
+ goto failed;
}
#endif /* #if defined(CUSTOMER_HW2) && defined(CONFIG_WIFI_CONTROL_FUNC) */
error = dhd_bus_register();
- if (!error)
- printf("\n%s\n", dhd_version);
- else {
+ if (error) {
DHD_ERROR(("%s: sdio_register_driver failed\n", __func__));
- goto faild;
+ goto failed;
}
return error;
-faild:
+failed:
/* turn off power and exit */
dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF);
return -EINVAL;
ASSERT(dhd != NULL);
bcmerror = wl_host_event(dhd, ifidx, pktdata, event, data);
- if (bcmerror != BCME_OK)
+ if (bcmerror != 0)
return bcmerror;
#if defined(CONFIG_WIRELESS_EXT)
/* send up locally generated event */
void dhd_sendup_event(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data)
{
- switch (ntoh32(event->event_type)) {
+ switch (be32_to_cpu(event->event_type)) {
default:
break;
}
/* open file to write */
fp = filp_open("/tmp/mem_dump", O_WRONLY | O_CREAT, 0640);
if (!fp) {
- printf("%s: open file error\n", __func__);
+ DHD_ERROR(("%s: open file error\n", __func__));
ret = -1;
goto exit;
}