Commit ce524c83 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
  eHEA: Fix bonding support
  Blackfin ethernet driver: on chip ethernet MAC controller driver
  fix wrong argument of tc35815_read_plat_dev_addr()
  ARM/ETHER3: Handle multicast frames.
  SAA9730: Handle multicast frames.
  NI5010: Handle multicast frames.
  NS83820: Handle multicast frames.
  Fix RGMII-ID handling in gianfar
  Fix Vitesse RGMII-ID support
  Add phy-connection-type to gianfar nodes
  Fix Vitesse 824x PHY interrupt acking
  [PATCH] zd1211rw: Add ID for Siemens Gigaset USB Stick 54
  [PATCH] zd1211rw: Add ID for Planex GW-US54GXS
  [PATCH] Update version ipw2200 stamp to 1.2.2
  [PATCH] ipw2200: Fix ipw_isr() comments error on shared IRQ
  [PATCH] Fix ipw2200 set wrong power parameter causing firmware error
  [PATCH] ipw2100: Fix `iwpriv set_power` error
  [PATCH] softmac: Channel is listed twice in scan output
parents 789c56b7 f9e29228
...@@ -1250,6 +1250,12 @@ platforms are moved over to use the flattened-device-tree model. ...@@ -1250,6 +1250,12 @@ platforms are moved over to use the flattened-device-tree model.
network device. This is used by the bootwrapper to interpret network device. This is used by the bootwrapper to interpret
MAC addresses passed by the firmware when no information other MAC addresses passed by the firmware when no information other
than indices is available to associate an address with a device. than indices is available to associate an address with a device.
- phy-connection-type : a string naming the controller/PHY interface type,
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
"tbi", or "rtbi". This property is only really needed if the connection
is of type "rgmii-id", as all other connection types are detected by
hardware.
Example: Example:
......
...@@ -732,6 +732,13 @@ L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) ...@@ -732,6 +732,13 @@ L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
W: http://blackfin.uclinux.org W: http://blackfin.uclinux.org
S: Supported S: Supported
BLACKFIN EMAC DRIVER
P: Bryan Wu
M: bryan.wu@analog.com
L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
W: http://blackfin.uclinux.org
S: Supported
BLACKFIN RTC DRIVER BLACKFIN RTC DRIVER
P: Mike Frysinger P: Mike Frysinger
M: michael.frysinger@analog.com M: michael.frysinger@analog.com
......
...@@ -131,6 +131,7 @@ ethernet@24000 { ...@@ -131,6 +131,7 @@ ethernet@24000 {
interrupts = <1d 2 1e 2 22 2>; interrupts = <1d 2 1e 2 22 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
phy-handle = <&phy0>; phy-handle = <&phy0>;
phy-connection-type = "rgmii-id";
}; };
ethernet@25000 { ethernet@25000 {
...@@ -150,6 +151,7 @@ ethernet@25000 { ...@@ -150,6 +151,7 @@ ethernet@25000 {
interrupts = <23 2 24 2 28 2>; interrupts = <23 2 24 2 28 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-connection-type = "rgmii-id";
}; };
ethernet@26000 { ethernet@26000 {
...@@ -169,6 +171,7 @@ ethernet@26000 { ...@@ -169,6 +171,7 @@ ethernet@26000 {
interrupts = <1F 2 20 2 21 2>; interrupts = <1F 2 20 2 21 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
phy-handle = <&phy2>; phy-handle = <&phy2>;
phy-connection-type = "rgmii-id";
}; };
ethernet@27000 { ethernet@27000 {
...@@ -188,6 +191,7 @@ ethernet@27000 { ...@@ -188,6 +191,7 @@ ethernet@27000 {
interrupts = <25 2 26 2 27 2>; interrupts = <25 2 26 2 27 2>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
phy-handle = <&phy3>; phy-handle = <&phy3>;
phy-connection-type = "rgmii-id";
}; };
serial@4500 { serial@4500 {
device_type = "serial"; device_type = "serial";
......
...@@ -197,6 +197,7 @@ static int __init gfar_of_init(void) ...@@ -197,6 +197,7 @@ static int __init gfar_of_init(void)
struct gianfar_platform_data gfar_data; struct gianfar_platform_data gfar_data;
const unsigned int *id; const unsigned int *id;
const char *model; const char *model;
const char *ctype;
const void *mac_addr; const void *mac_addr;
const phandle *ph; const phandle *ph;
int n_res = 2; int n_res = 2;
...@@ -254,6 +255,14 @@ static int __init gfar_of_init(void) ...@@ -254,6 +255,14 @@ static int __init gfar_of_init(void)
FSL_GIANFAR_DEV_HAS_VLAN | FSL_GIANFAR_DEV_HAS_VLAN |
FSL_GIANFAR_DEV_HAS_EXTENDED_HASH; FSL_GIANFAR_DEV_HAS_EXTENDED_HASH;
ctype = of_get_property(np, "phy-connection-type", NULL);
/* We only care about rgmii-id. The rest are autodetected */
if (ctype && !strcmp(ctype, "rgmii-id"))
gfar_data.interface = PHY_INTERFACE_MODE_RGMII_ID;
else
gfar_data.interface = PHY_INTERFACE_MODE_MII;
ph = of_get_property(np, "phy-handle", NULL); ph = of_get_property(np, "phy-handle", NULL);
phy = of_find_node_by_phandle(*ph); phy = of_find_node_by_phandle(*ph);
......
...@@ -838,6 +838,50 @@ config ULTRA32 ...@@ -838,6 +838,50 @@ config ULTRA32
<file:Documentation/networking/net-modules.txt>. The module <file:Documentation/networking/net-modules.txt>. The module
will be called smc-ultra32. will be called smc-ultra32.
config BFIN_MAC
tristate "Blackfin 536/537 on-chip mac support"
depends on NET_ETHERNET && (BF537 || BF536) && (!BF537_PORT_H)
select CRC32
select BFIN_MAC_USE_L1 if DMA_UNCACHED_NONE
help
This is the driver for blackfin on-chip mac device. Say Y if you want it
compiled into the kernel. This driver is also available as a module
( = code which can be inserted in and removed from the running kernel
whenever you want). The module will be called bfin_mac.
config BFIN_MAC_USE_L1
bool "Use L1 memory for rx/tx packets"
depends on BFIN_MAC && BF537
default y
help
To get maximum network performace, you should use L1 memory as rx/tx buffers.
Say N here if you want to reserve L1 memory for other uses.
config BFIN_TX_DESC_NUM
int "Number of transmit buffer packets"
depends on BFIN_MAC
range 6 10 if BFIN_MAC_USE_L1
range 10 100
default "10"
help
Set the number of buffer packets used in driver.
config BFIN_RX_DESC_NUM
int "Number of receive buffer packets"
depends on BFIN_MAC
range 20 100 if BFIN_MAC_USE_L1
range 20 800
default "20"
help
Set the number of buffer packets used in driver.
config BFIN_MAC_RMII
bool "RMII PHY Interface (EXPERIMENTAL)"
depends on BFIN_MAC && EXPERIMENTAL
default n
help
Use Reduced PHY MII Interface
config SMC9194 config SMC9194
tristate "SMC 9194 support" tristate "SMC 9194 support"
depends on NET_VENDOR_SMC && (ISA || MAC && BROKEN) depends on NET_VENDOR_SMC && (ISA || MAC && BROKEN)
......
...@@ -200,6 +200,7 @@ obj-$(CONFIG_S2IO) += s2io.o ...@@ -200,6 +200,7 @@ obj-$(CONFIG_S2IO) += s2io.o
obj-$(CONFIG_MYRI10GE) += myri10ge/ obj-$(CONFIG_MYRI10GE) += myri10ge/
obj-$(CONFIG_SMC91X) += smc91x.o obj-$(CONFIG_SMC91X) += smc91x.o
obj-$(CONFIG_SMC911X) += smc911x.o obj-$(CONFIG_SMC911X) += smc911x.o
obj-$(CONFIG_BFIN_MAC) += bfin_mac.o
obj-$(CONFIG_DM9000) += dm9000.o obj-$(CONFIG_DM9000) += dm9000.o
obj-$(CONFIG_FEC_8XX) += fec_8xx/ obj-$(CONFIG_FEC_8XX) += fec_8xx/
obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o
......
...@@ -464,7 +464,7 @@ static void ether3_setmulticastlist(struct net_device *dev) ...@@ -464,7 +464,7 @@ static void ether3_setmulticastlist(struct net_device *dev)
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
/* promiscuous mode */ /* promiscuous mode */
priv(dev)->regs.config1 |= CFG1_RECVPROMISC; priv(dev)->regs.config1 |= CFG1_RECVPROMISC;
} else if (dev->flags & IFF_ALLMULTI) { } else if (dev->flags & IFF_ALLMULTI || dev->mc_count) {
priv(dev)->regs.config1 |= CFG1_RECVSPECBRMULTI; priv(dev)->regs.config1 |= CFG1_RECVSPECBRMULTI;
} else } else
priv(dev)->regs.config1 |= CFG1_RECVSPECBROAD; priv(dev)->regs.config1 |= CFG1_RECVSPECBROAD;
......
This diff is collapsed.
/*
* File: drivers/net/bfin_mac.c
* Based on:
* Maintainer:
* Bryan Wu <bryan.wu@analog.com>
*
* Original author:
* Luke Yang <luke.yang@analog.com>
*
* Created:
* Description:
*
* Modified:
* Copyright 2004-2006 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software ; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program ; see the file COPYING.
* If not, write to the Free Software Foundation,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* PHY REGISTER NAMES
*/
#define PHYREG_MODECTL 0x0000
#define PHYREG_MODESTAT 0x0001
#define PHYREG_PHYID1 0x0002
#define PHYREG_PHYID2 0x0003
#define PHYREG_ANAR 0x0004
#define PHYREG_ANLPAR 0x0005
#define PHYREG_ANER 0x0006
#define PHYREG_NSR 0x0010
#define PHYREG_LBREMR 0x0011
#define PHYREG_REC 0x0012
#define PHYREG_10CFG 0x0013
#define PHYREG_PHY1_1 0x0014
#define PHYREG_PHY1_2 0x0015
#define PHYREG_PHY2 0x0016
#define PHYREG_TW_1 0x0017
#define PHYREG_TW_2 0x0018
#define PHYREG_TEST 0x0019
#define PHY_RESET 0x8000
#define PHY_ANEG_EN 0x1000
#define PHY_DUPLEX 0x0100
#define PHY_SPD_SET 0x2000
#define BFIN_MAC_CSUM_OFFLOAD
struct dma_descriptor {
struct dma_descriptor *next_dma_desc;
unsigned long start_addr;
unsigned short config;
unsigned short x_count;
};
struct status_area_rx {
#if defined(BFIN_MAC_CSUM_OFFLOAD)
unsigned short ip_hdr_csum; /* ip header checksum */
/* ip payload(udp or tcp or others) checksum */
unsigned short ip_payload_csum;
#endif
unsigned long status_word; /* the frame status word */
};
struct status_area_tx {
unsigned long status_word; /* the frame status word */
};
/* use two descriptors for a packet */
struct net_dma_desc_rx {
struct net_dma_desc_rx *next;
struct sk_buff *skb;
struct dma_descriptor desc_a;
struct dma_descriptor desc_b;
struct status_area_rx status;
};
/* use two descriptors for a packet */
struct net_dma_desc_tx {
struct net_dma_desc_tx *next;
struct sk_buff *skb;
struct dma_descriptor desc_a;
struct dma_descriptor desc_b;
unsigned char packet[1560];
struct status_area_tx status;
};
struct bf537mac_local {
/*
* these are things that the kernel wants me to keep, so users
* can find out semi-useless statistics of how well the card is
* performing
*/
struct net_device_stats stats;
int version;
int FlowEnabled; /* record if data flow is active */
int EtherIntIVG; /* IVG for the ethernet interrupt */
int RXIVG; /* IVG for the RX completion */
int TXIVG; /* IVG for the TX completion */
int PhyAddr; /* PHY address */
int OpMode; /* set these bits n the OPMODE regs */
int Port10; /* set port speed to 10 Mbit/s */
int GenChksums; /* IP checksums to be calculated */
int NoRcveLnth; /* dont insert recv length at start of buffer */
int StripPads; /* remove trailing pad bytes */
int FullDuplex; /* set full duplex mode */
int Negotiate; /* enable auto negotiation */
int Loopback; /* loopback at the PHY */
int Cache; /* Buffers may be cached */
int FlowControl; /* flow control active */
int CLKIN; /* clock in value in MHZ */
unsigned short IntMask; /* interrupt mask */
unsigned char Mac[6]; /* MAC address of the board */
spinlock_t lock;
};
extern void get_bf537_ether_addr(char *addr);
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ehea" #define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0070" #define DRV_VERSION "EHEA_0071"
/* eHEA capability flags */ /* eHEA capability flags */
#define DLPAR_PORT_ADD_REM 1 #define DLPAR_PORT_ADD_REM 1
......
...@@ -466,6 +466,8 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev, ...@@ -466,6 +466,8 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
cqe->vlan_tag); cqe->vlan_tag);
else else
netif_receive_skb(skb); netif_receive_skb(skb);
dev->last_rx = jiffies;
} else { } else {
pr->p_stats.poll_receive_errors++; pr->p_stats.poll_receive_errors++;
port_reset = ehea_treat_poll_error(pr, rq, cqe, port_reset = ehea_treat_poll_error(pr, rq, cqe,
...@@ -1433,7 +1435,8 @@ static int ehea_broadcast_reg_helper(struct ehea_port *port, u32 hcallid) ...@@ -1433,7 +1435,8 @@ static int ehea_broadcast_reg_helper(struct ehea_port *port, u32 hcallid)
port->logical_port_id, port->logical_port_id,
reg_type, port->mac_addr, 0, hcallid); reg_type, port->mac_addr, 0, hcallid);
if (hret != H_SUCCESS) { if (hret != H_SUCCESS) {
ehea_error("reg_dereg_bcmc failed (tagged)"); ehea_error("%sregistering bc address failed (tagged)",
hcallid == H_REG_BCMC ? "" : "de");
ret = -EIO; ret = -EIO;
goto out_herr; goto out_herr;
} }
...@@ -1444,7 +1447,8 @@ static int ehea_broadcast_reg_helper(struct ehea_port *port, u32 hcallid) ...@@ -1444,7 +1447,8 @@ static int ehea_broadcast_reg_helper(struct ehea_port *port, u32 hcallid)
port->logical_port_id, port->logical_port_id,
reg_type, port->mac_addr, 0, hcallid); reg_type, port->mac_addr, 0, hcallid);
if (hret != H_SUCCESS) { if (hret != H_SUCCESS) {
ehea_error("reg_dereg_bcmc failed (vlan)"); ehea_error("%sregistering bc address failed (vlan)",
hcallid == H_REG_BCMC ? "" : "de");
ret = -EIO; ret = -EIO;
} }
out_herr: out_herr:
...@@ -2170,7 +2174,6 @@ static int ehea_up(struct net_device *dev) ...@@ -2170,7 +2174,6 @@ static int ehea_up(struct net_device *dev)
{ {
int ret, i; int ret, i;
struct ehea_port *port = netdev_priv(dev); struct ehea_port *port = netdev_priv(dev);
u64 mac_addr = 0;
if (port->state == EHEA_PORT_UP) if (port->state == EHEA_PORT_UP)
return 0; return 0;
...@@ -2189,18 +2192,10 @@ static int ehea_up(struct net_device *dev) ...@@ -2189,18 +2192,10 @@ static int ehea_up(struct net_device *dev)
goto out_clean_pr; goto out_clean_pr;
} }
ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
if (ret) {
ret = -EIO;
ehea_error("out_clean_pr");
goto out_clean_pr;
}
mac_addr = (*(u64*)dev->dev_addr) >> 16;
ret = ehea_reg_interrupts(dev); ret = ehea_reg_interrupts(dev);
if (ret) { if (ret) {
ehea_error("out_dereg_bc"); ehea_error("reg_interrupts failed. ret:%d", ret);
goto out_dereg_bc; goto out_clean_pr;
} }
for(i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) { for(i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) {
...@@ -2226,9 +2221,6 @@ static int ehea_up(struct net_device *dev) ...@@ -2226,9 +2221,6 @@ static int ehea_up(struct net_device *dev)
out_free_irqs: out_free_irqs:
ehea_free_interrupts(dev); ehea_free_interrupts(dev);
out_dereg_bc:
ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
out_clean_pr: out_clean_pr:
ehea_clean_all_portres(port); ehea_clean_all_portres(port);
out: out:
...@@ -2273,7 +2265,6 @@ static int ehea_down(struct net_device *dev) ...@@ -2273,7 +2265,6 @@ static int ehea_down(struct net_device *dev)
&port->port_res[i].d_netdev->state)) &port->port_res[i].d_netdev->state))
msleep(1); msleep(1);
ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
port->state = EHEA_PORT_DOWN; port->state = EHEA_PORT_DOWN;
ret = ehea_clean_all_portres(port); ret = ehea_clean_all_portres(port);
...@@ -2655,12 +2646,18 @@ struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter, ...@@ -2655,12 +2646,18 @@ struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
INIT_WORK(&port->reset_task, ehea_reset_port); INIT_WORK(&port->reset_task, ehea_reset_port);
ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
if (ret) {
ret = -EIO;
goto out_unreg_port;
}
ehea_set_ethtool_ops(dev); ehea_set_ethtool_ops(dev);
ret = register_netdev(dev); ret = register_netdev(dev);
if (ret) { if (ret) {
ehea_error("register_netdev failed. ret=%d", ret); ehea_error("register_netdev failed. ret=%d", ret);
goto out_unreg_port; goto out_dereg_bc;
} }
ret = ehea_get_jumboframe_status(port, &jumbo); ret = ehea_get_jumboframe_status(port, &jumbo);
...@@ -2675,6 +2672,9 @@ struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter, ...@@ -2675,6 +2672,9 @@ struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
return port; return port;
out_dereg_bc:
ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
out_unreg_port: out_unreg_port:
ehea_unregister_port(port); ehea_unregister_port(port);
...@@ -2694,6 +2694,7 @@ static void ehea_shutdown_single_port(struct ehea_port *port) ...@@ -2694,6 +2694,7 @@ static void ehea_shutdown_single_port(struct ehea_port *port)
{ {
unregister_netdev(port->netdev); unregister_netdev(port->netdev);
ehea_unregister_port(port); ehea_unregister_port(port);
ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
kfree(port->mc_list); kfree(port->mc_list);
free_netdev(port->netdev); free_netdev(port->netdev);
port->adapter->active_ports--; port->adapter->active_ports--;
......
...@@ -420,8 +420,18 @@ static phy_interface_t gfar_get_interface(struct net_device *dev) ...@@ -420,8 +420,18 @@ static phy_interface_t gfar_get_interface(struct net_device *dev)
if (ecntrl & ECNTRL_REDUCED_MODE) { if (ecntrl & ECNTRL_REDUCED_MODE) {
if (ecntrl & ECNTRL_REDUCED_MII_MODE) if (ecntrl & ECNTRL_REDUCED_MII_MODE)
return PHY_INTERFACE_MODE_RMII; return PHY_INTERFACE_MODE_RMII;
else else {
phy_interface_t interface = priv->einfo->interface;
/*
* This isn't autodetected right now, so it must
* be set by the device tree or platform code.
*/
if (interface == PHY_INTERFACE_MODE_RGMII_ID)
return PHY_INTERFACE_MODE_RGMII_ID;
return PHY_INTERFACE_MODE_RGMII; return PHY_INTERFACE_MODE_RGMII;
}
} }
if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT) if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT)
......
...@@ -670,14 +670,10 @@ static void ni5010_set_multicast_list(struct net_device *dev) ...@@ -670,14 +670,10 @@ static void ni5010_set_multicast_list(struct net_device *dev)
PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name)); PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name));
if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI) { if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI || dev->mc_list) {
dev->flags |= IFF_PROMISC; dev->flags |= IFF_PROMISC;
outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */ outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */
PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name)); PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name));
} else if (dev->mc_list) {
/* Sorry, multicast not supported */
PRINTK((KERN_DEBUG "%s: No multicast, entering broadcast mode\n", dev->name));
outb(RMD_BROADCAST, EDLC_RMODE);
} else { } else {
PRINTK((KERN_DEBUG "%s: Entering broadcast mode\n", dev->name)); PRINTK((KERN_DEBUG "%s: Entering broadcast mode\n", dev->name));
outb(RMD_BROADCAST, EDLC_RMODE); /* Disable promiscuous mode, use normal mode */ outb(RMD_BROADCAST, EDLC_RMODE); /* Disable promiscuous mode, use normal mode */
......
...@@ -1582,7 +1582,7 @@ static void ns83820_set_multicast(struct net_device *ndev) ...@@ -1582,7 +1582,7 @@ static void ns83820_set_multicast(struct net_device *ndev)
else else
and_mask &= ~(RFCR_AAU | RFCR_AAM); and_mask &= ~(RFCR_AAU | RFCR_AAM);
if (ndev->flags & IFF_ALLMULTI) if (ndev->flags & IFF_ALLMULTI || ndev->mc_count)
or_mask |= RFCR_AAM; or_mask |= RFCR_AAM;
else else
and_mask &= ~RFCR_AAM; and_mask &= ~RFCR_AAM;
......
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
/* Vitesse Extended Control Register 1 */ /* Vitesse Extended Control Register 1 */
#define MII_VSC8244_EXT_CON1 0x17 #define MII_VSC8244_EXT_CON1 0x17
#define MII_VSC8244_EXTCON1_INIT 0x0000 #define MII_VSC8244_EXTCON1_INIT 0x0000
#define MII_VSC8244_EXTCON1_TX_SKEW_MASK 0x0c00
#define MII_VSC8244_EXTCON1_RX_SKEW_MASK 0x0300
#define MII_VSC8244_EXTCON1_TX_SKEW 0x0800
#define MII_VSC8244_EXTCON1_RX_SKEW 0x0200
/* Vitesse Interrupt Mask Register */ /* Vitesse Interrupt Mask Register */
#define MII_VSC8244_IMASK 0x19 #define MII_VSC8244_IMASK 0x19
...@@ -39,7 +43,7 @@ ...@@ -39,7 +43,7 @@
/* Vitesse Auxiliary Control/Status Register */ /* Vitesse Auxiliary Control/Status Register */
#define MII_VSC8244_AUX_CONSTAT 0x1c #define MII_VSC8244_AUX_CONSTAT 0x1c
#define MII_VSC8244_AUXCONSTAT_INIT 0x0004 #define MII_VSC8244_AUXCONSTAT_INIT 0x0000
#define MII_VSC8244_AUXCONSTAT_DUPLEX 0x0020 #define MII_VSC8244_AUXCONSTAT_DUPLEX 0x0020
#define MII_VSC8244_AUXCONSTAT_SPEED 0x0018 #define MII_VSC8244_AUXCONSTAT_SPEED 0x0018
#define MII_VSC8244_AUXCONSTAT_GBIT 0x0010 #define MII_VSC8244_AUXCONSTAT_GBIT 0x0010
...@@ -51,6 +55,7 @@ MODULE_LICENSE("GPL"); ...@@ -51,6 +55,7 @@ MODULE_LICENSE("GPL");
static int vsc824x_config_init(struct phy_device *phydev) static int vsc824x_config_init(struct phy_device *phydev)
{ {
int extcon;
int err; int err;
err = phy_write(phydev, MII_VSC8244_AUX_CONSTAT, err = phy_write(phydev, MII_VSC8244_AUX_CONSTAT,
...@@ -58,14 +63,34 @@ static int vsc824x_config_init(struct phy_device *phydev) ...@@ -58,14 +63,34 @@ static int vsc824x_config_init(struct phy_device *phydev)
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_VSC8244_EXT_CON1, extcon = phy_read(phydev, MII_VSC8244_EXT_CON1);
MII_VSC8244_EXTCON1_INIT);
if (extcon < 0)
return err;
extcon &= ~(MII_VSC8244_EXTCON1_TX_SKEW_MASK |
MII_VSC8244_EXTCON1_RX_SKEW_MASK);
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
extcon |= (MII_VSC8244_EXTCON1_TX_SKEW |
MII_VSC8244_EXTCON1_RX_SKEW);
err = phy_write(phydev, MII_VSC8244_EXT_CON1, extcon);
return err; return err;
} }
static int vsc824x_ack_interrupt(struct phy_device *phydev) static int vsc824x_ack_interrupt(struct phy_device *phydev)
{ {
int err = phy_read(phydev, MII_VSC8244_ISTAT); int err = 0;
/*
* Don't bother to ACK the interrupts if interrupts
* are disabled. The 824x cannot clear the interrupts
* if they are disabled.
*/
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
err = phy_read(phydev, MII_VSC8244_ISTAT);
return (err < 0) ? err : 0; return (err < 0) ? err : 0;
} }
...@@ -77,8 +102,19 @@ static int vsc824x_config_intr(struct phy_device *phydev) ...@@ -77,8 +102,19 @@ static int vsc824x_config_intr(struct phy_device *phydev)
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
err = phy_write(phydev, MII_VSC8244_IMASK, err = phy_write(phydev, MII_VSC8244_IMASK,
MII_VSC8244_IMASK_MASK); MII_VSC8244_IMASK_MASK);
else else {
/*
* The Vitesse PHY cannot clear the interrupt
* once it has disabled them, so we clear them first
*/
err = phy_read(phydev, MII_VSC8244_ISTAT);
if (err)
return err;
err = phy_write(phydev, MII_VSC8244_IMASK, 0); err = phy_write(phydev, MII_VSC8244_IMASK, 0);
}
return err; return err;
} }
......
...@@ -940,15 +940,14 @@ static void lan_saa9730_set_multicast(struct net_device *dev) ...@@ -940,15 +940,14 @@ static void lan_saa9730_set_multicast(struct net_device *dev)
CAM_CONTROL_GROUP_ACC | CAM_CONTROL_BROAD_ACC, CAM_CONTROL_GROUP_ACC | CAM_CONTROL_BROAD_ACC,
&lp->lan_saa9730_regs->CamCtl); &lp->lan_saa9730_regs->CamCtl);
} else { } else {
if (dev->flags & IFF_ALLMULTI) { if (dev->flags & IFF_ALLMULTI || dev->mc_count) {
/* accept all multicast packets */ /* accept all multicast packets */
writel(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC |
CAM_CONTROL_BROAD_ACC,
&lp->lan_saa9730_regs->CamCtl);
} else {
/* /*
* Will handle the multicast stuff later. -carstenl * Will handle the multicast stuff later. -carstenl
*/ */
writel(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC |
CAM_CONTROL_BROAD_ACC,
&lp->lan_saa9730_regs->CamCtl);
} }
} }
......
...@@ -626,7 +626,7 @@ static int __devinit tc35815_read_plat_dev_addr(struct net_device *dev) ...@@ -626,7 +626,7 @@ static int __devinit tc35815_read_plat_dev_addr(struct net_device *dev)
return -ENODEV; return -ENODEV;
} }
#else #else
static int __devinit tc35815_read_plat_dev_addr(struct device *dev) static int __devinit tc35815_read_plat_dev_addr(struct net_device *dev)
{ {
return -ENODEV; return -ENODEV;
} }
......
...@@ -7868,10 +7868,10 @@ static int ipw2100_wx_set_powermode(struct net_device *dev, ...@@ -7868,10 +7868,10 @@ static int ipw2100_wx_set_powermode(struct net_device *dev,
goto done; goto done;
} }
if ((mode < 1) || (mode > POWER_MODES)) if ((mode < 0) || (mode > POWER_MODES))
mode = IPW_POWER_AUTO; mode = IPW_POWER_AUTO;
if (priv->power_mode != mode) if (IPW_POWER_LEVEL(priv->power_mode) != mode)
err = ipw2100_set_power_mode(priv, mode); err = ipw2100_set_power_mode(priv, mode);
done: done:
mutex_unlock(&priv->action_mutex); mutex_unlock(&priv->action_mutex);
...@@ -7902,7 +7902,7 @@ static int ipw2100_wx_get_powermode(struct net_device *dev, ...@@ -7902,7 +7902,7 @@ static int ipw2100_wx_get_powermode(struct net_device *dev,
break; break;
case IPW_POWER_AUTO: case IPW_POWER_AUTO:
snprintf(extra, MAX_POWER_STRING, snprintf(extra, MAX_POWER_STRING,
"Power save level: %d (Auto)", 0); "Power save level: %d (Auto)", level);
break; break;
default: default:
timeout = timeout_duration[level - 1] / 1000; timeout = timeout_duration[level - 1] / 1000;
......
...@@ -70,7 +70,7 @@ ...@@ -70,7 +70,7 @@
#define VQ #define VQ
#endif #endif
#define IPW2200_VERSION "1.2.0" VK VD VM VP VR VQ #define IPW2200_VERSION "1.2.2" VK VD VM VP VR VQ
#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver" #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver"
#define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
#define DRV_VERSION IPW2200_VERSION #define DRV_VERSION IPW2200_VERSION
...@@ -2506,7 +2506,7 @@ static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) ...@@ -2506,7 +2506,7 @@ static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode)
break; break;
} }
param = cpu_to_le32(mode); param = cpu_to_le32(param);
return ipw_send_cmd_pdu(priv, IPW_CMD_POWER_MODE, sizeof(param), return ipw_send_cmd_pdu(priv, IPW_CMD_POWER_MODE, sizeof(param),
&param); &param);
} }
...@@ -9568,6 +9568,7 @@ static int ipw_wx_set_power(struct net_device *dev, ...@@ -9568,6 +9568,7 @@ static int ipw_wx_set_power(struct net_device *dev,
priv->power_mode = IPW_POWER_ENABLED | IPW_POWER_BATTERY; priv->power_mode = IPW_POWER_ENABLED | IPW_POWER_BATTERY;
else else
priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
if (err) { if (err) {
IPW_DEBUG_WX("failed setting power mode.\n"); IPW_DEBUG_WX("failed setting power mode.\n");
...@@ -9604,22 +9605,19 @@ static int ipw_wx_set_powermode(struct net_device *dev, ...@@ -9604,22 +9605,19 @@ static int ipw_wx_set_powermode(struct net_device *dev,
struct ipw_priv *priv = ieee80211_priv(dev); struct ipw_priv *priv = ieee80211_priv(dev);
int mode = *(int *)extra; int mode = *(int *)extra;
int err; int err;
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
if ((mode < 1) || (mode > IPW_POWER_LIMIT)) { if ((mode < 1) || (mode > IPW_POWER_LIMIT))
mode = IPW_POWER_AC; mode = IPW_POWER_AC;
priv->power_mode = mode;
} else {
priv->power_mode = IPW_POWER_ENABLED | mode;
}
if (priv->power_mode != mode) { if (IPW_POWER_LEVEL(priv->power_mode) != mode) {
err = ipw_send_power_mode(priv, mode); err = ipw_send_power_mode(priv, mode);
if (err) { if (err) {
IPW_DEBUG_WX("failed setting power mode.\n"); IPW_DEBUG_WX("failed setting power mode.\n");
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
return err; return err;
} }
priv->power_mode = IPW_POWER_ENABLED | mode;
} }
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
return 0; return 0;
...@@ -10555,7 +10553,7 @@ static irqreturn_t ipw_isr(int irq, void *data) ...@@ -10555,7 +10553,7 @@ static irqreturn_t ipw_isr(int irq, void *data)
spin_lock(&priv->irq_lock); spin_lock(&priv->irq_lock);
if (!(priv->status & STATUS_INT_ENABLED)) { if (!(priv->status & STATUS_INT_ENABLED)) {
/* Shared IRQ */ /* IRQ is disabled */
goto none; goto none;
} }
......
...@@ -72,6 +72,8 @@ static struct usb_device_id usb_ids[] = { ...@@ -72,6 +72,8 @@ static struct usb_device_id usb_ids[] = {
{ USB_DEVICE(0x0586, 0x3413), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0586, 0x3413), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x0053, 0x5301), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0053, 0x5301), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x0411, 0x00da), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0411, 0x00da), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x129b, 0x1667), .driver_info = DEVICE_ZD1211B },
/* "Driverless" devices that need ejecting */ /* "Driverless" devices that need ejecting */
{ USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
{ USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER }, { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },
......
...@@ -53,6 +53,7 @@ struct gianfar_platform_data { ...@@ -53,6 +53,7 @@ struct gianfar_platform_data {
u32 bus_id; u32 bus_id;
u32 phy_id; u32 phy_id;
u8 mac_addr[6]; u8 mac_addr[6];
phy_interface_t interface;
}; };
struct gianfar_mdio_data { struct gianfar_mdio_data {
......
...@@ -90,14 +90,11 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, ...@@ -90,14 +90,11 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee,
} }
/* Add channel and frequency */ /* Add channel and frequency */
/* Note : userspace automatically computes channel using iwrange */
iwe.cmd = SIOCGIWFREQ; iwe.cmd = SIOCGIWFREQ;
iwe.u.freq.m = network->channel;
iwe.u.freq.e = 0;
iwe.u.freq.i = 0;
start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN);
iwe.u.freq.m = ieee80211_channel_to_freq(ieee, network->channel); iwe.u.freq.m = ieee80211_channel_to_freq(ieee, network->channel);
iwe.u.freq.e = 6; iwe.u.freq.e = 6;
iwe.u.freq.i = 0;
start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN); start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN);
/* Add encryption capability */ /* Add encryption capability */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment