You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (75 commits) net: Handle NETREG_UNINITIALIZED devices correctly can: add the driver for Analog Devices Blackfin on-chip CAN controllers xfrm: Fix truncation length of authentication algorithms installed via PF_KEY net: use compat helper functions in compat_sys_recvmmsg net: fix compat_sys_recvmmsg parameter type cxgb3: Fixing EEH handlers cnic: Zero out status block and Event Queue indices. cnic: Send delete command when shutting down iSCSI ring. net: smc91x: Fix up type mismatch in smc_drv_resume(). smc91x: fix unused flags warnings on UP systems MAINTAINERS: Transfering maintainership of cdc-ether net: Add missing TST_CFG_WRITE bits around sky2_pci_write net: Fix Yukon-2 Optima TCP offload setup net: niu uses crc32, so select CRC32 wireless: update old static regulatory domain rules mac80211: Revert 'Use correct sign for mesh active path refresh' mac80211: Fixed bug in mesh portal paths net/mac80211: Correct size given to memset b43: Remove reset after fatal DMA error rtl8187: add radio led and fix warnings on suspend ...
This commit is contained in:
@@ -68,22 +68,38 @@ GigaSet 307x Device Driver
|
||||
for troubleshooting or to pass module parameters.
|
||||
|
||||
The module ser_gigaset provides a serial line discipline N_GIGASET_M101
|
||||
which drives the device through the regular serial line driver. It must
|
||||
be attached to the serial line to which the M101 is connected with the
|
||||
ldattach(8) command (requires util-linux-ng release 2.14 or later), for
|
||||
example:
|
||||
ldattach GIGASET_M101 /dev/ttyS1
|
||||
which uses the regular serial port driver to access the device, and must
|
||||
therefore be attached to the serial device to which the M101 is connected.
|
||||
The ldattach(8) command (included in util-linux-ng release 2.14 or later)
|
||||
can be used for that purpose, for example:
|
||||
ldattach GIGASET_M101 /dev/ttyS1
|
||||
This will open the device file, attach the line discipline to it, and
|
||||
then sleep in the background, keeping the device open so that the line
|
||||
discipline remains active. To deactivate it, kill the daemon, for example
|
||||
with
|
||||
killall ldattach
|
||||
killall ldattach
|
||||
before disconnecting the device. To have this happen automatically at
|
||||
system startup/shutdown on an LSB compatible system, create and activate
|
||||
an appropriate LSB startup script /etc/init.d/gigaset. (The init name
|
||||
'gigaset' is officially assigned to this project by LANANA.)
|
||||
Alternatively, just add the 'ldattach' command line to /etc/rc.local.
|
||||
|
||||
The modules accept the following parameters:
|
||||
|
||||
Module Parameter Meaning
|
||||
|
||||
gigaset debug debug level (see section 3.2.)
|
||||
|
||||
startmode initial operation mode (see section 2.5.):
|
||||
bas_gigaset ) 1=ISDN4linux/CAPI (default), 0=Unimodem
|
||||
ser_gigaset )
|
||||
usb_gigaset ) cidmode initial Call-ID mode setting (see section
|
||||
2.5.): 1=on (default), 0=off
|
||||
|
||||
Depending on your distribution you may want to create a separate module
|
||||
configuration file /etc/modprobe.d/gigaset for these, or add them to a
|
||||
custom file like /etc/modprobe.conf.local.
|
||||
|
||||
2.2. Device nodes for user space programs
|
||||
------------------------------------
|
||||
The device can be accessed from user space (eg. by the user space tools
|
||||
@@ -93,11 +109,48 @@ GigaSet 307x Device Driver
|
||||
- /dev/ttyGU0 for M105 (USB data boxes)
|
||||
- /dev/ttyGB0 for the base driver (direct USB connection)
|
||||
|
||||
You can also select a "default device" which is used by the frontends when
|
||||
If you connect more than one device of a type, they will get consecutive
|
||||
device nodes, eg. /dev/ttyGU1 for a second M105.
|
||||
|
||||
You can also set a "default device" for the user space tools to use when
|
||||
no device node is given as parameter, by creating a symlink /dev/ttyG to
|
||||
one of them, eg.:
|
||||
|
||||
ln -s /dev/ttyGB0 /dev/ttyG
|
||||
ln -s /dev/ttyGB0 /dev/ttyG
|
||||
|
||||
The devices accept the following device specific ioctl calls
|
||||
(defined in gigaset_dev.h):
|
||||
|
||||
ioctl(int fd, GIGASET_REDIR, int *cmd);
|
||||
If cmd==1, the device is set to be controlled exclusively through the
|
||||
character device node; access from the ISDN subsystem is blocked.
|
||||
If cmd==0, the device is set to be used from the ISDN subsystem and does
|
||||
not communicate through the character device node.
|
||||
|
||||
ioctl(int fd, GIGASET_CONFIG, int *cmd);
|
||||
(ser_gigaset and usb_gigaset only)
|
||||
If cmd==1, the device is set to adapter configuration mode where commands
|
||||
are interpreted by the M10x DECT adapter itself instead of being
|
||||
forwarded to the base station. In this mode, the device accepts the
|
||||
commands described in Siemens document "AT-Kommando Alignment M10x Data"
|
||||
for setting the operation mode, associating with a base station and
|
||||
querying parameters like field strengh and signal quality.
|
||||
Note that there is no ioctl command for leaving adapter configuration
|
||||
mode and returning to regular operation. In order to leave adapter
|
||||
configuration mode, write the command ATO to the device.
|
||||
|
||||
ioctl(int fd, GIGASET_BRKCHARS, unsigned char brkchars[6]);
|
||||
(usb_gigaset only)
|
||||
Set the break characters on an M105's internal serial adapter to the six
|
||||
bytes stored in brkchars[]. Unused bytes should be set to zero.
|
||||
|
||||
ioctl(int fd, GIGASET_VERSION, unsigned version[4]);
|
||||
Retrieve version information from the driver. version[0] must be set to
|
||||
one of:
|
||||
- GIGVER_DRIVER: retrieve driver version
|
||||
- GIGVER_COMPAT: retrieve interface compatibility version
|
||||
- GIGVER_FWBASE: retrieve the firmware version of the base
|
||||
Upon return, version[] is filled with the requested version information.
|
||||
|
||||
2.3. ISDN4linux
|
||||
----------
|
||||
@@ -113,15 +166,24 @@ GigaSet 307x Device Driver
|
||||
Connection State: 0, Response: -1
|
||||
gigaset_process_response: resp_code -1 in ConState 0 !
|
||||
Timeout occurred
|
||||
you might need to use unimodem mode. (see section 2.5.)
|
||||
you probably need to use unimodem mode. (see section 2.5.)
|
||||
|
||||
2.4. CAPI
|
||||
----
|
||||
If the driver is compiled with CAPI support (kernel configuration option
|
||||
GIGASET_CAPI, experimental) it can also be used with CAPI 2.0 kernel and
|
||||
user space applications. ISDN4Linux is supported in this configuration
|
||||
user space applications. For user space access, the module capi.ko must
|
||||
be loaded. The capiinit command (included in the capi4k-utils package)
|
||||
does this for you.
|
||||
|
||||
The CAPI variant of the driver supports legacy ISDN4Linux applications
|
||||
via the capidrv compatibility driver. The kernel module capidrv.ko must
|
||||
be loaded explicitly ("modprobe capidrv") if needed.
|
||||
be loaded explicitly with the command
|
||||
modprobe capidrv
|
||||
if needed, and cannot be unloaded again without unloading the driver
|
||||
first. (These are limitations of capidrv.)
|
||||
|
||||
The note about unimodem mode in the preceding section applies here, too.
|
||||
|
||||
2.5. Unimodem mode
|
||||
-------------
|
||||
@@ -134,9 +196,14 @@ GigaSet 307x Device Driver
|
||||
You can switch back using
|
||||
gigacontr --mode isdn
|
||||
|
||||
You can also load the driver using e.g.
|
||||
modprobe usb_gigaset startmode=0
|
||||
to prevent the driver from starting in "isdn4linux mode".
|
||||
You can also put the driver directly into Unimodem mode when it's loaded,
|
||||
by passing the module parameter startmode=0 to the hardware specific
|
||||
module, e.g.
|
||||
modprobe usb_gigaset startmode=0
|
||||
or by adding a line like
|
||||
options usb_gigaset startmode=0
|
||||
to an appropriate module configuration file, like /etc/modprobe.d/gigaset
|
||||
or /etc/modprobe.conf.local.
|
||||
|
||||
In this mode the device works like a modem connected to a serial port
|
||||
(the /dev/ttyGU0, ... mentioned above) which understands the commands
|
||||
@@ -164,9 +231,8 @@ GigaSet 307x Device Driver
|
||||
|
||||
options ppp_async flag_time=0
|
||||
|
||||
to /etc/modprobe.conf. If your distribution has some local module
|
||||
configuration file like /etc/modprobe.conf.local,
|
||||
using that should be preferred.
|
||||
to an appropriate module configuration file, like /etc/modprobe.d/gigaset
|
||||
or /etc/modprobe.conf.local.
|
||||
|
||||
2.6. Call-ID (CID) mode
|
||||
------------------
|
||||
@@ -189,12 +255,13 @@ GigaSet 307x Device Driver
|
||||
settings (CID mode).
|
||||
- If you have several DECT data devices (M10x) which you want to use
|
||||
in turn, select Unimodem mode by passing the parameter "cidmode=0" to
|
||||
the driver ("modprobe usb_gigaset cidmode=0" or modprobe.conf).
|
||||
the appropriate driver module (ser_gigaset or usb_gigaset).
|
||||
|
||||
If you want both of these at once, you are out of luck.
|
||||
|
||||
You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
|
||||
setting (ttyGxy is ttyGU0 or ttyGB0).
|
||||
You can also use the tty class parameter "cidmode" of the device to
|
||||
change its CID mode while the driver is loaded, eg.
|
||||
echo 0 > /sys/class/tty/ttyGU0/cidmode
|
||||
|
||||
2.7. Unregistered Wireless Devices (M101/M105)
|
||||
-----------------------------------------
|
||||
@@ -208,7 +275,7 @@ GigaSet 307x Device Driver
|
||||
driver. In that situation, a restricted set of functions is available
|
||||
which includes, in particular, those necessary for registering the device
|
||||
to a base or for switching it between Fixed Part and Portable Part
|
||||
modes.
|
||||
modes. See the gigacontr(8) manpage for details.
|
||||
|
||||
3. Troubleshooting
|
||||
---------------
|
||||
@@ -222,9 +289,7 @@ GigaSet 307x Device Driver
|
||||
|
||||
options isdn dialtimeout=15
|
||||
|
||||
to /etc/modprobe.conf. If your distribution has some local module
|
||||
configuration file like /etc/modprobe.conf.local,
|
||||
using that should be preferred.
|
||||
to /etc/modprobe.d/gigaset, /etc/modprobe.conf.local or a similar file.
|
||||
|
||||
Problem:
|
||||
Your isdn script aborts with a message about isdnlog.
|
||||
@@ -264,7 +329,8 @@ GigaSet 307x Device Driver
|
||||
The initial value can be set using the debug parameter when loading the
|
||||
module "gigaset", e.g. by adding a line
|
||||
options gigaset debug=0
|
||||
to /etc/modprobe.conf, ...
|
||||
to your module configuration file, eg. /etc/modprobe.d/gigaset or
|
||||
/etc/modprobe.conf.local.
|
||||
|
||||
Generated debugging information can be found
|
||||
- as output of the command
|
||||
|
||||
+1
-2
@@ -5439,10 +5439,9 @@ S: Supported
|
||||
F: drivers/block/ub.c
|
||||
|
||||
USB CDC ETHERNET DRIVER
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Oliver Neukum <oliver@neukum.name>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.kroah.com/linux-usb/
|
||||
F: drivers/net/usb/cdc_*.c
|
||||
F: include/linux/usb/cdc.h
|
||||
|
||||
|
||||
+2
-2
@@ -2505,7 +2505,7 @@ he_close(struct atm_vcc *vcc)
|
||||
* TBRQ, the host issues the close command to the adapter.
|
||||
*/
|
||||
|
||||
while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 0) &&
|
||||
while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 1) &&
|
||||
(retry < MAX_RETRY)) {
|
||||
msleep(sleep);
|
||||
if (sleep < 250)
|
||||
@@ -2514,7 +2514,7 @@ he_close(struct atm_vcc *vcc)
|
||||
++retry;
|
||||
}
|
||||
|
||||
if (tx_inuse)
|
||||
if (tx_inuse > 1)
|
||||
hprintk("close tx cid 0x%x tx_inuse = %d\n", cid, tx_inuse);
|
||||
|
||||
/* 2.3.1.1 generic close operations with flush */
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#endif
|
||||
|
||||
/* Module parameters */
|
||||
int gigaset_debuglevel = DEBUG_DEFAULT;
|
||||
int gigaset_debuglevel;
|
||||
EXPORT_SYMBOL_GPL(gigaset_debuglevel);
|
||||
module_param_named(debug, gigaset_debuglevel, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(debug, "debug level");
|
||||
|
||||
@@ -2696,6 +2696,7 @@ config NETXEN_NIC
|
||||
config NIU
|
||||
tristate "Sun Neptune 10Gbit Ethernet support"
|
||||
depends on PCI
|
||||
select CRC32
|
||||
help
|
||||
This enables support for cards based upon Sun's
|
||||
Neptune chipset.
|
||||
|
||||
@@ -479,6 +479,9 @@ struct atl1c_buffer {
|
||||
#define ATL1C_PCIMAP_PAGE 0x0008
|
||||
#define ATL1C_PCIMAP_TYPE_MASK 0x000C
|
||||
|
||||
#define ATL1C_PCIMAP_TODEVICE 0x0010
|
||||
#define ATL1C_PCIMAP_FROMDEVICE 0x0020
|
||||
#define ATL1C_PCIMAP_DIRECTION_MASK 0x0030
|
||||
dma_addr_t dma;
|
||||
};
|
||||
|
||||
@@ -487,9 +490,11 @@ struct atl1c_buffer {
|
||||
((buff)->flags) |= (state); \
|
||||
} while (0)
|
||||
|
||||
#define ATL1C_SET_PCIMAP_TYPE(buff, type) do { \
|
||||
((buff)->flags) &= ~ATL1C_PCIMAP_TYPE_MASK; \
|
||||
((buff)->flags) |= (type); \
|
||||
#define ATL1C_SET_PCIMAP_TYPE(buff, type, direction) do { \
|
||||
((buff)->flags) &= ~ATL1C_PCIMAP_TYPE_MASK; \
|
||||
((buff)->flags) |= (type); \
|
||||
((buff)->flags) &= ~ATL1C_PCIMAP_DIRECTION_MASK; \
|
||||
((buff)->flags) |= (direction); \
|
||||
} while (0)
|
||||
|
||||
/* transimit packet descriptor (tpd) ring */
|
||||
@@ -550,6 +555,9 @@ struct atl1c_adapter {
|
||||
#define __AT_TESTING 0x0001
|
||||
#define __AT_RESETTING 0x0002
|
||||
#define __AT_DOWN 0x0003
|
||||
u8 work_event;
|
||||
#define ATL1C_WORK_EVENT_RESET 0x01
|
||||
#define ATL1C_WORK_EVENT_LINK_CHANGE 0x02
|
||||
u32 msg_enable;
|
||||
|
||||
bool have_msi;
|
||||
@@ -561,8 +569,7 @@ struct atl1c_adapter {
|
||||
spinlock_t tx_lock;
|
||||
atomic_t irq_sem;
|
||||
|
||||
struct work_struct reset_task;
|
||||
struct work_struct link_chg_task;
|
||||
struct work_struct common_task;
|
||||
struct timer_list watchdog_timer;
|
||||
struct timer_list phy_config_timer;
|
||||
|
||||
|
||||
@@ -198,27 +198,12 @@ static void atl1c_phy_config(unsigned long data)
|
||||
|
||||
void atl1c_reinit_locked(struct atl1c_adapter *adapter)
|
||||
{
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
atl1c_down(adapter);
|
||||
atl1c_up(adapter);
|
||||
clear_bit(__AT_RESETTING, &adapter->flags);
|
||||
}
|
||||
|
||||
static void atl1c_reset_task(struct work_struct *work)
|
||||
{
|
||||
struct atl1c_adapter *adapter;
|
||||
struct net_device *netdev;
|
||||
|
||||
adapter = container_of(work, struct atl1c_adapter, reset_task);
|
||||
netdev = adapter->netdev;
|
||||
|
||||
netif_device_detach(netdev);
|
||||
atl1c_down(adapter);
|
||||
atl1c_up(adapter);
|
||||
netif_device_attach(netdev);
|
||||
}
|
||||
|
||||
static void atl1c_check_link_status(struct atl1c_adapter *adapter)
|
||||
{
|
||||
struct atl1c_hw *hw = &adapter->hw;
|
||||
@@ -275,18 +260,6 @@ static void atl1c_check_link_status(struct atl1c_adapter *adapter)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* atl1c_link_chg_task - deal with link change event Out of interrupt context
|
||||
* @netdev: network interface device structure
|
||||
*/
|
||||
static void atl1c_link_chg_task(struct work_struct *work)
|
||||
{
|
||||
struct atl1c_adapter *adapter;
|
||||
|
||||
adapter = container_of(work, struct atl1c_adapter, link_chg_task);
|
||||
atl1c_check_link_status(adapter);
|
||||
}
|
||||
|
||||
static void atl1c_link_chg_event(struct atl1c_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
@@ -311,19 +284,39 @@ static void atl1c_link_chg_event(struct atl1c_adapter *adapter)
|
||||
adapter->link_speed = SPEED_0;
|
||||
}
|
||||
}
|
||||
schedule_work(&adapter->link_chg_task);
|
||||
|
||||
adapter->work_event |= ATL1C_WORK_EVENT_LINK_CHANGE;
|
||||
schedule_work(&adapter->common_task);
|
||||
}
|
||||
|
||||
static void atl1c_common_task(struct work_struct *work)
|
||||
{
|
||||
struct atl1c_adapter *adapter;
|
||||
struct net_device *netdev;
|
||||
|
||||
adapter = container_of(work, struct atl1c_adapter, common_task);
|
||||
netdev = adapter->netdev;
|
||||
|
||||
if (adapter->work_event & ATL1C_WORK_EVENT_RESET) {
|
||||
netif_device_detach(netdev);
|
||||
atl1c_down(adapter);
|
||||
atl1c_up(adapter);
|
||||
netif_device_attach(netdev);
|
||||
return;
|
||||
}
|
||||
|
||||
if (adapter->work_event & ATL1C_WORK_EVENT_LINK_CHANGE)
|
||||
atl1c_check_link_status(adapter);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void atl1c_del_timer(struct atl1c_adapter *adapter)
|
||||
{
|
||||
del_timer_sync(&adapter->phy_config_timer);
|
||||
}
|
||||
|
||||
static void atl1c_cancel_work(struct atl1c_adapter *adapter)
|
||||
{
|
||||
cancel_work_sync(&adapter->reset_task);
|
||||
cancel_work_sync(&adapter->link_chg_task);
|
||||
}
|
||||
|
||||
/*
|
||||
* atl1c_tx_timeout - Respond to a Tx Hang
|
||||
@@ -334,7 +327,8 @@ static void atl1c_tx_timeout(struct net_device *netdev)
|
||||
struct atl1c_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
/* Do the reset outside of interrupt context */
|
||||
schedule_work(&adapter->reset_task);
|
||||
adapter->work_event |= ATL1C_WORK_EVENT_RESET;
|
||||
schedule_work(&adapter->common_task);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -713,15 +707,21 @@ static int __devinit atl1c_sw_init(struct atl1c_adapter *adapter)
|
||||
static inline void atl1c_clean_buffer(struct pci_dev *pdev,
|
||||
struct atl1c_buffer *buffer_info, int in_irq)
|
||||
{
|
||||
u16 pci_driection;
|
||||
if (buffer_info->flags & ATL1C_BUFFER_FREE)
|
||||
return;
|
||||
if (buffer_info->dma) {
|
||||
if (buffer_info->flags & ATL1C_PCIMAP_FROMDEVICE)
|
||||
pci_driection = PCI_DMA_FROMDEVICE;
|
||||
else
|
||||
pci_driection = PCI_DMA_TODEVICE;
|
||||
|
||||
if (buffer_info->flags & ATL1C_PCIMAP_SINGLE)
|
||||
pci_unmap_single(pdev, buffer_info->dma,
|
||||
buffer_info->length, PCI_DMA_TODEVICE);
|
||||
buffer_info->length, pci_driection);
|
||||
else if (buffer_info->flags & ATL1C_PCIMAP_PAGE)
|
||||
pci_unmap_page(pdev, buffer_info->dma,
|
||||
buffer_info->length, PCI_DMA_TODEVICE);
|
||||
buffer_info->length, pci_driection);
|
||||
}
|
||||
if (buffer_info->skb) {
|
||||
if (in_irq)
|
||||
@@ -1533,7 +1533,8 @@ static irqreturn_t atl1c_intr(int irq, void *data)
|
||||
/* reset MAC */
|
||||
hw->intr_mask &= ~ISR_ERROR;
|
||||
AT_WRITE_REG(hw, REG_IMR, hw->intr_mask);
|
||||
schedule_work(&adapter->reset_task);
|
||||
adapter->work_event |= ATL1C_WORK_EVENT_RESET;
|
||||
schedule_work(&adapter->common_task);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1606,7 +1607,8 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, const int ringid
|
||||
buffer_info->dma = pci_map_single(pdev, vir_addr,
|
||||
buffer_info->length,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_FROMDEVICE);
|
||||
rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||
rfd_next_to_use = next_next;
|
||||
if (++next_next == rfd_ring->count)
|
||||
@@ -1967,7 +1969,8 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
buffer_info->dma = pci_map_single(adapter->pdev,
|
||||
skb->data, hdr_len, PCI_DMA_TODEVICE);
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
mapped_len += map_len;
|
||||
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
||||
@@ -1988,7 +1991,8 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
pci_map_single(adapter->pdev, skb->data + mapped_len,
|
||||
buffer_info->length, PCI_DMA_TODEVICE);
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
||||
}
|
||||
@@ -2009,7 +2013,8 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
buffer_info->length,
|
||||
PCI_DMA_TODEVICE);
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_PAGE);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_PAGE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
||||
}
|
||||
@@ -2198,8 +2203,7 @@ void atl1c_down(struct atl1c_adapter *adapter)
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
||||
atl1c_del_timer(adapter);
|
||||
atl1c_cancel_work(adapter);
|
||||
|
||||
adapter->work_event = 0; /* clear all event */
|
||||
/* signal that we're down so the interrupt handler does not
|
||||
* reschedule our watchdog timer */
|
||||
set_bit(__AT_DOWN, &adapter->flags);
|
||||
@@ -2599,8 +2603,8 @@ static int __devinit atl1c_probe(struct pci_dev *pdev,
|
||||
adapter->hw.mac_addr[4], adapter->hw.mac_addr[5]);
|
||||
|
||||
atl1c_hw_set_mac_addr(&adapter->hw);
|
||||
INIT_WORK(&adapter->reset_task, atl1c_reset_task);
|
||||
INIT_WORK(&adapter->link_chg_task, atl1c_link_chg_task);
|
||||
INIT_WORK(&adapter->common_task, atl1c_common_task);
|
||||
adapter->work_event = 0;
|
||||
err = register_netdev(netdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "register netdevice failed\n");
|
||||
|
||||
+1
-2
@@ -1505,8 +1505,7 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)
|
||||
for (k = 0; k< ethaddr_bytes; k++) {
|
||||
ppattern[offset + magicsync +
|
||||
(j * ETH_ALEN) + k] = macaddr[k];
|
||||
len++;
|
||||
set_bit(len, (unsigned long *) pmask);
|
||||
set_bit(len++, (unsigned long *) pmask);
|
||||
}
|
||||
}
|
||||
return len - 1;
|
||||
|
||||
@@ -54,6 +54,15 @@ config CAN_MCP251X
|
||||
---help---
|
||||
Driver for the Microchip MCP251x SPI CAN controllers.
|
||||
|
||||
config CAN_BFIN
|
||||
depends on CAN_DEV && (BF534 || BF536 || BF537 || BF538 || BF539 || BF54x)
|
||||
tristate "Analog Devices Blackfin on-chip CAN"
|
||||
---help---
|
||||
Driver for the Analog Devices Blackfin on-chip CAN controllers
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called bfin_can.
|
||||
|
||||
source "drivers/net/can/mscan/Kconfig"
|
||||
|
||||
source "drivers/net/can/sja1000/Kconfig"
|
||||
|
||||
@@ -14,5 +14,6 @@ obj-$(CONFIG_CAN_MSCAN) += mscan/
|
||||
obj-$(CONFIG_CAN_AT91) += at91_can.o
|
||||
obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o
|
||||
obj-$(CONFIG_CAN_MCP251X) += mcp251x.o
|
||||
obj-$(CONFIG_CAN_BFIN) += bfin_can.o
|
||||
|
||||
ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1104,6 +1104,8 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
|
||||
cp->bnx2x_status_blk = cp->status_blk;
|
||||
cp->bnx2x_def_status_blk = cp->ethdev->irq_arr[1].status_blk;
|
||||
|
||||
memset(cp->bnx2x_status_blk, 0, sizeof(struct host_status_block));
|
||||
|
||||
cp->l2_rx_ring_size = 15;
|
||||
|
||||
ret = cnic_alloc_l2_rings(dev, 4);
|
||||
@@ -4183,6 +4185,12 @@ static void cnic_shutdown_rings(struct cnic_dev *dev)
|
||||
cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_ETH_HALT,
|
||||
BNX2X_ISCSI_L2_CID, ETH_CONNECTION_TYPE, &l5_data);
|
||||
msleep(10);
|
||||
|
||||
memset(&l5_data, 0, sizeof(l5_data));
|
||||
cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_ETH_CFC_DEL,
|
||||
BNX2X_ISCSI_L2_CID, ETH_CONNECTION_TYPE |
|
||||
(1 << SPE_HDR_COMMON_RAMROD_SHIFT), &l5_data);
|
||||
msleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4289,6 +4297,9 @@ static void cnic_stop_bnx2x_hw(struct cnic_dev *dev)
|
||||
offsetof(struct cstorm_status_block_c,
|
||||
index_values[HC_INDEX_C_ISCSI_EQ_CONS]),
|
||||
0);
|
||||
CNIC_WR(dev, BAR_CSTRORM_INTMEM +
|
||||
CSTORM_ISCSI_EQ_CONS_OFFSET(cp->func, 0), 0);
|
||||
CNIC_WR16(dev, cp->kcq_io_addr, 0);
|
||||
cnic_free_resc(dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -2860,6 +2860,7 @@ static int t3_reenable_adapter(struct adapter *adapter)
|
||||
}
|
||||
pci_set_master(adapter->pdev);
|
||||
pci_restore_state(adapter->pdev);
|
||||
pci_save_state(adapter->pdev);
|
||||
|
||||
/* Free sge resources */
|
||||
t3_free_sge_resources(adapter);
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
#define E1000_WUS_BC E1000_WUFC_BC
|
||||
|
||||
/* Extended Device Control */
|
||||
#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */
|
||||
#define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Definable Pin 3 */
|
||||
#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */
|
||||
#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */
|
||||
#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */
|
||||
|
||||
+66
-35
@@ -46,6 +46,9 @@
|
||||
#define E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT 0x0000
|
||||
#define E1000_KMRNCTRLSTA_OPMODE_E_IDLE 0x2000
|
||||
|
||||
#define E1000_KMRNCTRLSTA_OPMODE_MASK 0x000C
|
||||
#define E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO 0x0004
|
||||
|
||||
#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */
|
||||
#define DEFAULT_TCTL_EXT_GCEX_80003ES2LAN 0x00010000
|
||||
|
||||
@@ -462,28 +465,36 @@ static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/*
|
||||
* The "ready" bit in the MDIC register may be incorrectly set
|
||||
* before the device has completed the "Page Select" MDI
|
||||
* transaction. So we wait 200us after each MDI command...
|
||||
*/
|
||||
udelay(200);
|
||||
if (hw->dev_spec.e80003es2lan.mdic_wa_enable == true) {
|
||||
/*
|
||||
* The "ready" bit in the MDIC register may be incorrectly set
|
||||
* before the device has completed the "Page Select" MDI
|
||||
* transaction. So we wait 200us after each MDI command...
|
||||
*/
|
||||
udelay(200);
|
||||
|
||||
/* ...and verify the command was successful. */
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
|
||||
/* ...and verify the command was successful. */
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
|
||||
|
||||
if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
e1000_release_phy_80003es2lan(hw);
|
||||
return ret_val;
|
||||
if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
e1000_release_phy_80003es2lan(hw);
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
udelay(200);
|
||||
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw,
|
||||
MAX_PHY_REG_ADDRESS & offset,
|
||||
data);
|
||||
|
||||
udelay(200);
|
||||
} else {
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw,
|
||||
MAX_PHY_REG_ADDRESS & offset,
|
||||
data);
|
||||
}
|
||||
|
||||
udelay(200);
|
||||
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
|
||||
data);
|
||||
|
||||
udelay(200);
|
||||
e1000_release_phy_80003es2lan(hw);
|
||||
|
||||
return ret_val;
|
||||
@@ -526,28 +537,35 @@ static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
if (hw->dev_spec.e80003es2lan.mdic_wa_enable == true) {
|
||||
/*
|
||||
* The "ready" bit in the MDIC register may be incorrectly set
|
||||
* before the device has completed the "Page Select" MDI
|
||||
* transaction. So we wait 200us after each MDI command...
|
||||
*/
|
||||
udelay(200);
|
||||
|
||||
/*
|
||||
* The "ready" bit in the MDIC register may be incorrectly set
|
||||
* before the device has completed the "Page Select" MDI
|
||||
* transaction. So we wait 200us after each MDI command...
|
||||
*/
|
||||
udelay(200);
|
||||
/* ...and verify the command was successful. */
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
|
||||
|
||||
/* ...and verify the command was successful. */
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw, page_select, &temp);
|
||||
if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
|
||||
e1000_release_phy_80003es2lan(hw);
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
|
||||
if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
|
||||
e1000_release_phy_80003es2lan(hw);
|
||||
return -E1000_ERR_PHY;
|
||||
udelay(200);
|
||||
|
||||
ret_val = e1000e_write_phy_reg_mdic(hw,
|
||||
MAX_PHY_REG_ADDRESS & offset,
|
||||
data);
|
||||
|
||||
udelay(200);
|
||||
} else {
|
||||
ret_val = e1000e_write_phy_reg_mdic(hw,
|
||||
MAX_PHY_REG_ADDRESS & offset,
|
||||
data);
|
||||
}
|
||||
|
||||
udelay(200);
|
||||
|
||||
ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
|
||||
data);
|
||||
|
||||
udelay(200);
|
||||
e1000_release_phy_80003es2lan(hw);
|
||||
|
||||
return ret_val;
|
||||
@@ -866,6 +884,19 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw)
|
||||
reg_data &= ~0x00100000;
|
||||
E1000_WRITE_REG_ARRAY(hw, E1000_FFLT, 0x0001, reg_data);
|
||||
|
||||
/* default to true to enable the MDIC W/A */
|
||||
hw->dev_spec.e80003es2lan.mdic_wa_enable = true;
|
||||
|
||||
ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
|
||||
E1000_KMRNCTRLSTA_OFFSET >>
|
||||
E1000_KMRNCTRLSTA_OFFSET_SHIFT,
|
||||
&i);
|
||||
if (!ret_val) {
|
||||
if ((i & E1000_KMRNCTRLSTA_OPMODE_MASK) ==
|
||||
E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO)
|
||||
hw->dev_spec.e80003es2lan.mdic_wa_enable = false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear all of the statistics registers (clear on read). It is
|
||||
* important that we do this after we have tried to establish link
|
||||
|
||||
@@ -302,6 +302,8 @@ enum e1e_registers {
|
||||
#define E1000_KMRNCTRLSTA_OFFSET_SHIFT 16
|
||||
#define E1000_KMRNCTRLSTA_REN 0x00200000
|
||||
#define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */
|
||||
#define E1000_KMRNCTRLSTA_TIMEOUTS 0x4 /* Kumeran Timeouts */
|
||||
#define E1000_KMRNCTRLSTA_INBAND_PARAM 0x9 /* Kumeran InBand Parameters */
|
||||
#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */
|
||||
#define E1000_KMRNCTRLSTA_K1_CONFIG 0x7
|
||||
#define E1000_KMRNCTRLSTA_K1_ENABLE 0x140E
|
||||
@@ -898,6 +900,10 @@ struct e1000_dev_spec_82571 {
|
||||
u32 smb_counter;
|
||||
};
|
||||
|
||||
struct e1000_dev_spec_80003es2lan {
|
||||
bool mdic_wa_enable;
|
||||
};
|
||||
|
||||
struct e1000_shadow_ram {
|
||||
u16 value;
|
||||
bool modified;
|
||||
@@ -926,6 +932,7 @@ struct e1000_hw {
|
||||
|
||||
union {
|
||||
struct e1000_dev_spec_82571 e82571;
|
||||
struct e1000_dev_spec_80003es2lan e80003es2lan;
|
||||
struct e1000_dev_spec_ich8lan ich8lan;
|
||||
} dev_spec;
|
||||
};
|
||||
|
||||
@@ -2755,14 +2755,16 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
|
||||
* and increase the max iterations when polling the phy;
|
||||
* this fixes erroneous timeouts at 10Mbps.
|
||||
*/
|
||||
ret_val = e1000e_write_kmrn_reg(hw, GG82563_REG(0x34, 4), 0xFFFF);
|
||||
ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_TIMEOUTS, 0xFFFF);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
ret_val = e1000e_read_kmrn_reg(hw, GG82563_REG(0x34, 9), ®_data);
|
||||
ret_val = e1000e_read_kmrn_reg(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
|
||||
®_data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
reg_data |= 0x3F;
|
||||
ret_val = e1000e_write_kmrn_reg(hw, GG82563_REG(0x34, 9), reg_data);
|
||||
ret_val = e1000e_write_kmrn_reg(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
|
||||
reg_data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
|
||||
@@ -4541,7 +4541,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
||||
e1000_media_type_internal_serdes) {
|
||||
/* keep the laser running in D3 */
|
||||
ctrl_ext = er32(CTRL_EXT);
|
||||
ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
|
||||
ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA;
|
||||
ew32(CTRL_EXT, ctrl_ext);
|
||||
}
|
||||
|
||||
|
||||
+62
-59
@@ -85,11 +85,15 @@ MODULE_PARM_DESC(debug, "debugging messages level");
|
||||
|
||||
static void mpc52xx_fec_tx_timeout(struct net_device *dev)
|
||||
{
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
dev_warn(&dev->dev, "transmit timed out\n");
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
mpc52xx_fec_reset(dev);
|
||||
|
||||
dev->stats.tx_errors++;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
@@ -135,28 +139,32 @@ static void mpc52xx_fec_free_rx_buffers(struct net_device *dev, struct bcom_task
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mpc52xx_fec_rx_submit(struct net_device *dev, struct sk_buff *rskb)
|
||||
{
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
struct bcom_fec_bd *bd;
|
||||
|
||||
bd = (struct bcom_fec_bd *) bcom_prepare_next_buffer(priv->rx_dmatsk);
|
||||
bd->status = FEC_RX_BUFFER_SIZE;
|
||||
bd->skb_pa = dma_map_single(dev->dev.parent, rskb->data,
|
||||
FEC_RX_BUFFER_SIZE, DMA_FROM_DEVICE);
|
||||
bcom_submit_next_buffer(priv->rx_dmatsk, rskb);
|
||||
}
|
||||
|
||||
static int mpc52xx_fec_alloc_rx_buffers(struct net_device *dev, struct bcom_task *rxtsk)
|
||||
{
|
||||
while (!bcom_queue_full(rxtsk)) {
|
||||
struct sk_buff *skb;
|
||||
struct bcom_fec_bd *bd;
|
||||
struct sk_buff *skb;
|
||||
|
||||
while (!bcom_queue_full(rxtsk)) {
|
||||
skb = dev_alloc_skb(FEC_RX_BUFFER_SIZE);
|
||||
if (skb == NULL)
|
||||
if (!skb)
|
||||
return -EAGAIN;
|
||||
|
||||
/* zero out the initial receive buffers to aid debugging */
|
||||
memset(skb->data, 0, FEC_RX_BUFFER_SIZE);
|
||||
|
||||
bd = (struct bcom_fec_bd *)bcom_prepare_next_buffer(rxtsk);
|
||||
|
||||
bd->status = FEC_RX_BUFFER_SIZE;
|
||||
bd->skb_pa = dma_map_single(dev->dev.parent, skb->data,
|
||||
FEC_RX_BUFFER_SIZE, DMA_FROM_DEVICE);
|
||||
|
||||
bcom_submit_next_buffer(rxtsk, skb);
|
||||
mpc52xx_fec_rx_submit(dev, skb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -328,13 +336,12 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
bcom_submit_next_buffer(priv->tx_dmatsk, skb);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
if (bcom_queue_full(priv->tx_dmatsk)) {
|
||||
netif_stop_queue(dev);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -359,9 +366,9 @@ static irqreturn_t mpc52xx_fec_tx_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&priv->lock);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
while (bcom_buffer_done(priv->tx_dmatsk)) {
|
||||
struct sk_buff *skb;
|
||||
struct bcom_fec_bd *bd;
|
||||
@@ -372,11 +379,10 @@ static irqreturn_t mpc52xx_fec_tx_interrupt(int irq, void *dev_id)
|
||||
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
netif_wake_queue(dev);
|
||||
|
||||
spin_unlock(&priv->lock);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -384,67 +390,60 @@ static irqreturn_t mpc52xx_fec_rx_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
struct sk_buff *rskb; /* received sk_buff */
|
||||
struct sk_buff *skb; /* new sk_buff to enqueue in its place */
|
||||
struct bcom_fec_bd *bd;
|
||||
u32 status, physaddr;
|
||||
int length;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
while (bcom_buffer_done(priv->rx_dmatsk)) {
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *rskb;
|
||||
struct bcom_fec_bd *bd;
|
||||
u32 status;
|
||||
|
||||
rskb = bcom_retrieve_buffer(priv->rx_dmatsk, &status,
|
||||
(struct bcom_bd **)&bd);
|
||||
dma_unmap_single(dev->dev.parent, bd->skb_pa, rskb->len,
|
||||
DMA_FROM_DEVICE);
|
||||
(struct bcom_bd **)&bd);
|
||||
physaddr = bd->skb_pa;
|
||||
|
||||
/* Test for errors in received frame */
|
||||
if (status & BCOM_FEC_RX_BD_ERRORS) {
|
||||
/* Drop packet and reuse the buffer */
|
||||
bd = (struct bcom_fec_bd *)
|
||||
bcom_prepare_next_buffer(priv->rx_dmatsk);
|
||||
|
||||
bd->status = FEC_RX_BUFFER_SIZE;
|
||||
bd->skb_pa = dma_map_single(dev->dev.parent,
|
||||
rskb->data,
|
||||
FEC_RX_BUFFER_SIZE, DMA_FROM_DEVICE);
|
||||
|
||||
bcom_submit_next_buffer(priv->rx_dmatsk, rskb);
|
||||
|
||||
mpc52xx_fec_rx_submit(dev, rskb);
|
||||
dev->stats.rx_dropped++;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/* skbs are allocated on open, so now we allocate a new one,
|
||||
* and remove the old (with the packet) */
|
||||
skb = dev_alloc_skb(FEC_RX_BUFFER_SIZE);
|
||||
if (skb) {
|
||||
/* Process the received skb */
|
||||
int length = status & BCOM_FEC_RX_BD_LEN_MASK;
|
||||
|
||||
skb_put(rskb, length - 4); /* length without CRC32 */
|
||||
|
||||
rskb->dev = dev;
|
||||
rskb->protocol = eth_type_trans(rskb, dev);
|
||||
|
||||
netif_rx(rskb);
|
||||
} else {
|
||||
if (!skb) {
|
||||
/* Can't get a new one : reuse the same & drop pkt */
|
||||
dev_notice(&dev->dev, "Memory squeeze, dropping packet.\n");
|
||||
dev_notice(&dev->dev, "Low memory - dropped packet.\n");
|
||||
mpc52xx_fec_rx_submit(dev, rskb);
|
||||
dev->stats.rx_dropped++;
|
||||
|
||||
skb = rskb;
|
||||
continue;
|
||||
}
|
||||
|
||||
bd = (struct bcom_fec_bd *)
|
||||
bcom_prepare_next_buffer(priv->rx_dmatsk);
|
||||
/* Enqueue the new sk_buff back on the hardware */
|
||||
mpc52xx_fec_rx_submit(dev, skb);
|
||||
|
||||
bd->status = FEC_RX_BUFFER_SIZE;
|
||||
bd->skb_pa = dma_map_single(dev->dev.parent, skb->data,
|
||||
FEC_RX_BUFFER_SIZE, DMA_FROM_DEVICE);
|
||||
/* Process the received skb - Drop the spin lock while
|
||||
* calling into the network stack */
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
bcom_submit_next_buffer(priv->rx_dmatsk, skb);
|
||||
dma_unmap_single(dev->dev.parent, physaddr, rskb->len,
|
||||
DMA_FROM_DEVICE);
|
||||
length = status & BCOM_FEC_RX_BD_LEN_MASK;
|
||||
skb_put(rskb, length - 4); /* length without CRC32 */
|
||||
rskb->dev = dev;
|
||||
rskb->protocol = eth_type_trans(rskb, dev);
|
||||
netif_rx(rskb);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -454,6 +453,7 @@ static irqreturn_t mpc52xx_fec_interrupt(int irq, void *dev_id)
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
struct mpc52xx_fec __iomem *fec = priv->fec;
|
||||
u32 ievent;
|
||||
unsigned long flags;
|
||||
|
||||
ievent = in_be32(&fec->ievent);
|
||||
|
||||
@@ -471,9 +471,10 @@ static irqreturn_t mpc52xx_fec_interrupt(int irq, void *dev_id)
|
||||
if (net_ratelimit() && (ievent & FEC_IEVENT_XFIFO_ERROR))
|
||||
dev_warn(&dev->dev, "FEC_IEVENT_XFIFO_ERROR\n");
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
mpc52xx_fec_reset(dev);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
netif_wake_queue(dev);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -768,6 +769,8 @@ static void mpc52xx_fec_reset(struct net_device *dev)
|
||||
bcom_enable(priv->tx_dmatsk);
|
||||
|
||||
mpc52xx_fec_start(dev);
|
||||
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2644,6 +2644,7 @@ static void gfar_netpoll(struct net_device *dev)
|
||||
gfar_interrupt(priv->gfargrp[i].interruptTransmit,
|
||||
&priv->gfargrp[i]);
|
||||
enable_irq(priv->gfargrp[i].interruptTransmit);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user