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 branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
What: /sys/devices/platform/at91_can/net/<iface>/mb0_id
|
||||
Date: January 2011
|
||||
KernelVersion: 2.6.38
|
||||
Contact: Marc Kleine-Budde <kernel@pengutronix.de>
|
||||
Description:
|
||||
Value representing the can_id of mailbox 0.
|
||||
|
||||
Default: 0x7ff (standard frame)
|
||||
|
||||
Due to a chip bug (errata 50.2.6.3 & 50.3.5.3 in
|
||||
"AT91SAM9263 Preliminary 6249H-ATARM-27-Jul-09") the
|
||||
contents of mailbox 0 may be send under certain
|
||||
conditions (even if disabled or in rx mode).
|
||||
|
||||
The workaround in the errata suggests not to use the
|
||||
mailbox and load it with an unused identifier.
|
||||
|
||||
In order to use an extended can_id add the
|
||||
CAN_EFF_FLAG (0x80000000U) to the can_id. Example:
|
||||
|
||||
- standard id 0x7ff:
|
||||
echo 0x7ff > /sys/class/net/can0/mb0_id
|
||||
|
||||
- extended id 0x1fffffff:
|
||||
echo 0x9fffffff > /sys/class/net/can0/mb0_id
|
||||
@@ -49,7 +49,8 @@ Table of Contents
|
||||
3.3 Configuring Bonding Manually with Ifenslave
|
||||
3.3.1 Configuring Multiple Bonds Manually
|
||||
3.4 Configuring Bonding Manually via Sysfs
|
||||
3.5 Overriding Configuration for Special Cases
|
||||
3.5 Configuration with Interfaces Support
|
||||
3.6 Overriding Configuration for Special Cases
|
||||
|
||||
4. Querying Bonding Configuration
|
||||
4.1 Bonding Configuration
|
||||
@@ -161,8 +162,8 @@ onwards) do not have /usr/include/linux symbolically linked to the
|
||||
default kernel source include directory.
|
||||
|
||||
SECOND IMPORTANT NOTE:
|
||||
If you plan to configure bonding using sysfs, you do not need
|
||||
to use ifenslave.
|
||||
If you plan to configure bonding using sysfs or using the
|
||||
/etc/network/interfaces file, you do not need to use ifenslave.
|
||||
|
||||
2. Bonding Driver Options
|
||||
=========================
|
||||
@@ -779,22 +780,26 @@ resend_igmp
|
||||
|
||||
You can configure bonding using either your distro's network
|
||||
initialization scripts, or manually using either ifenslave or the
|
||||
sysfs interface. Distros generally use one of two packages for the
|
||||
network initialization scripts: initscripts or sysconfig. Recent
|
||||
versions of these packages have support for bonding, while older
|
||||
sysfs interface. Distros generally use one of three packages for the
|
||||
network initialization scripts: initscripts, sysconfig or interfaces.
|
||||
Recent versions of these packages have support for bonding, while older
|
||||
versions do not.
|
||||
|
||||
We will first describe the options for configuring bonding for
|
||||
distros using versions of initscripts and sysconfig with full or
|
||||
partial support for bonding, then provide information on enabling
|
||||
distros using versions of initscripts, sysconfig and interfaces with full
|
||||
or partial support for bonding, then provide information on enabling
|
||||
bonding without support from the network initialization scripts (i.e.,
|
||||
older versions of initscripts or sysconfig).
|
||||
|
||||
If you're unsure whether your distro uses sysconfig or
|
||||
initscripts, or don't know if it's new enough, have no fear.
|
||||
If you're unsure whether your distro uses sysconfig,
|
||||
initscripts or interfaces, or don't know if it's new enough, have no fear.
|
||||
Determining this is fairly straightforward.
|
||||
|
||||
First, issue the command:
|
||||
First, look for a file called interfaces in /etc/network directory.
|
||||
If this file is present in your system, then your system use interfaces. See
|
||||
Configuration with Interfaces Support.
|
||||
|
||||
Else, issue the command:
|
||||
|
||||
$ rpm -qf /sbin/ifup
|
||||
|
||||
@@ -1327,8 +1332,62 @@ echo 2000 > /sys/class/net/bond1/bonding/arp_interval
|
||||
echo +eth2 > /sys/class/net/bond1/bonding/slaves
|
||||
echo +eth3 > /sys/class/net/bond1/bonding/slaves
|
||||
|
||||
3.5 Overriding Configuration for Special Cases
|
||||
3.5 Configuration with Interfaces Support
|
||||
-----------------------------------------
|
||||
|
||||
This section applies to distros which use /etc/network/interfaces file
|
||||
to describe network interface configuration, most notably Debian and it's
|
||||
derivatives.
|
||||
|
||||
The ifup and ifdown commands on Debian don't support bonding out of
|
||||
the box. The ifenslave-2.6 package should be installed to provide bonding
|
||||
support. Once installed, this package will provide bond-* options to be used
|
||||
into /etc/network/interfaces.
|
||||
|
||||
Note that ifenslave-2.6 package will load the bonding module and use
|
||||
the ifenslave command when appropriate.
|
||||
|
||||
Example Configurations
|
||||
----------------------
|
||||
|
||||
In /etc/network/interfaces, the following stanza will configure bond0, in
|
||||
active-backup mode, with eth0 and eth1 as slaves.
|
||||
|
||||
auto bond0
|
||||
iface bond0 inet dhcp
|
||||
bond-slaves eth0 eth1
|
||||
bond-mode active-backup
|
||||
bond-miimon 100
|
||||
bond-primary eth0 eth1
|
||||
|
||||
If the above configuration doesn't work, you might have a system using
|
||||
upstart for system startup. This is most notably true for recent
|
||||
Ubuntu versions. The following stanza in /etc/network/interfaces will
|
||||
produce the same result on those systems.
|
||||
|
||||
auto bond0
|
||||
iface bond0 inet dhcp
|
||||
bond-slaves none
|
||||
bond-mode active-backup
|
||||
bond-miimon 100
|
||||
|
||||
auto eth0
|
||||
iface eth0 inet manual
|
||||
bond-master bond0
|
||||
bond-primary eth0 eth1
|
||||
|
||||
auto eth1
|
||||
iface eth1 inet manual
|
||||
bond-master bond0
|
||||
bond-primary eth0 eth1
|
||||
|
||||
For a full list of bond-* supported options in /etc/network/interfaces and some
|
||||
more advanced examples tailored to you particular distros, see the files in
|
||||
/usr/share/doc/ifenslave-2.6.
|
||||
|
||||
3.6 Overriding Configuration for Special Cases
|
||||
----------------------------------------------
|
||||
|
||||
When using the bonding driver, the physical port which transmits a frame is
|
||||
typically selected by the bonding driver, and is not relevant to the user or
|
||||
system administrator. The output port is simply selected using the policies of
|
||||
|
||||
@@ -3327,7 +3327,6 @@ F: drivers/net/wimax/i2400m/
|
||||
F: include/linux/wimax/i2400m.h
|
||||
|
||||
INTEL WIRELESS WIFI LINK (iwlwifi)
|
||||
M: Reinette Chatre <reinette.chatre@intel.com>
|
||||
M: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
M: Intel Linux Wireless <ilw@linux.intel.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
||||
+21
-56
@@ -47,33 +47,16 @@ MODULE_DEVICE_TABLE(usb, ath3k_table);
|
||||
#define USB_REQ_DFU_DNLOAD 1
|
||||
#define BULK_SIZE 4096
|
||||
|
||||
struct ath3k_data {
|
||||
struct usb_device *udev;
|
||||
u8 *fw_data;
|
||||
u32 fw_size;
|
||||
u32 fw_sent;
|
||||
};
|
||||
|
||||
static int ath3k_load_firmware(struct ath3k_data *data,
|
||||
unsigned char *firmware,
|
||||
int count)
|
||||
static int ath3k_load_firmware(struct usb_device *udev,
|
||||
const struct firmware *firmware)
|
||||
{
|
||||
u8 *send_buf;
|
||||
int err, pipe, len, size, sent = 0;
|
||||
int count = firmware->size;
|
||||
|
||||
BT_DBG("ath3k %p udev %p", data, data->udev);
|
||||
BT_DBG("udev %p", udev);
|
||||
|
||||
pipe = usb_sndctrlpipe(data->udev, 0);
|
||||
|
||||
if ((usb_control_msg(data->udev, pipe,
|
||||
USB_REQ_DFU_DNLOAD,
|
||||
USB_TYPE_VENDOR, 0, 0,
|
||||
firmware, 20, USB_CTRL_SET_TIMEOUT)) < 0) {
|
||||
BT_ERR("Can't change to loading configuration err");
|
||||
return -EBUSY;
|
||||
}
|
||||
sent += 20;
|
||||
count -= 20;
|
||||
pipe = usb_sndctrlpipe(udev, 0);
|
||||
|
||||
send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC);
|
||||
if (!send_buf) {
|
||||
@@ -81,12 +64,23 @@ static int ath3k_load_firmware(struct ath3k_data *data,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(send_buf, firmware->data, 20);
|
||||
if ((err = usb_control_msg(udev, pipe,
|
||||
USB_REQ_DFU_DNLOAD,
|
||||
USB_TYPE_VENDOR, 0, 0,
|
||||
send_buf, 20, USB_CTRL_SET_TIMEOUT)) < 0) {
|
||||
BT_ERR("Can't change to loading configuration err");
|
||||
goto error;
|
||||
}
|
||||
sent += 20;
|
||||
count -= 20;
|
||||
|
||||
while (count) {
|
||||
size = min_t(uint, count, BULK_SIZE);
|
||||
pipe = usb_sndbulkpipe(data->udev, 0x02);
|
||||
memcpy(send_buf, firmware + sent, size);
|
||||
pipe = usb_sndbulkpipe(udev, 0x02);
|
||||
memcpy(send_buf, firmware->data + sent, size);
|
||||
|
||||
err = usb_bulk_msg(data->udev, pipe, send_buf, size,
|
||||
err = usb_bulk_msg(udev, pipe, send_buf, size,
|
||||
&len, 3000);
|
||||
|
||||
if (err || (len != size)) {
|
||||
@@ -112,57 +106,28 @@ static int ath3k_probe(struct usb_interface *intf,
|
||||
{
|
||||
const struct firmware *firmware;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct ath3k_data *data;
|
||||
int size;
|
||||
|
||||
BT_DBG("intf %p id %p", intf, id);
|
||||
|
||||
if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
|
||||
return -ENODEV;
|
||||
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
data->udev = udev;
|
||||
|
||||
if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) {
|
||||
kfree(data);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
size = max_t(uint, firmware->size, 4096);
|
||||
data->fw_data = kmalloc(size, GFP_KERNEL);
|
||||
if (!data->fw_data) {
|
||||
if (ath3k_load_firmware(udev, firmware)) {
|
||||
release_firmware(firmware);
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(data->fw_data, firmware->data, firmware->size);
|
||||
data->fw_size = firmware->size;
|
||||
data->fw_sent = 0;
|
||||
release_firmware(firmware);
|
||||
|
||||
usb_set_intfdata(intf, data);
|
||||
if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) {
|
||||
usb_set_intfdata(intf, NULL);
|
||||
kfree(data->fw_data);
|
||||
kfree(data);
|
||||
return -EIO;
|
||||
}
|
||||
release_firmware(firmware);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ath3k_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct ath3k_data *data = usb_get_intfdata(intf);
|
||||
|
||||
BT_DBG("ath3k_disconnect intf %p", intf);
|
||||
|
||||
kfree(data->fw_data);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static struct usb_driver ath3k_driver = {
|
||||
|
||||
@@ -7553,6 +7553,10 @@ bnx2_set_flags(struct net_device *dev, u32 data)
|
||||
!(data & ETH_FLAG_RXVLAN))
|
||||
return -EINVAL;
|
||||
|
||||
/* TSO with VLAN tag won't work with current firmware */
|
||||
if (!(data & ETH_FLAG_TXVLAN))
|
||||
return -EINVAL;
|
||||
|
||||
rc = ethtool_op_set_flags(dev, data, ETH_FLAG_RXHASH | ETH_FLAG_RXVLAN |
|
||||
ETH_FLAG_TXVLAN);
|
||||
if (rc)
|
||||
|
||||
+112
-26
@@ -2,7 +2,7 @@
|
||||
* at91_can.c - CAN network driver for AT91 SoC CAN controller
|
||||
*
|
||||
* (C) 2007 by Hans J. Koch <hjk@hansjkoch.de>
|
||||
* (C) 2008, 2009, 2010 by Marc Kleine-Budde <kernel@pengutronix.de>
|
||||
* (C) 2008, 2009, 2010, 2011 by Marc Kleine-Budde <kernel@pengutronix.de>
|
||||
*
|
||||
* This software may be distributed under the terms of the GNU General
|
||||
* Public License ("GPL") version 2 as distributed in the 'COPYING'
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
@@ -40,22 +41,23 @@
|
||||
|
||||
#include <mach/board.h>
|
||||
|
||||
#define AT91_NAPI_WEIGHT 12
|
||||
#define AT91_NAPI_WEIGHT 11
|
||||
|
||||
/*
|
||||
* RX/TX Mailbox split
|
||||
* don't dare to touch
|
||||
*/
|
||||
#define AT91_MB_RX_NUM 12
|
||||
#define AT91_MB_RX_NUM 11
|
||||
#define AT91_MB_TX_SHIFT 2
|
||||
|
||||
#define AT91_MB_RX_FIRST 0
|
||||
#define AT91_MB_RX_FIRST 1
|
||||
#define AT91_MB_RX_LAST (AT91_MB_RX_FIRST + AT91_MB_RX_NUM - 1)
|
||||
|
||||
#define AT91_MB_RX_MASK(i) ((1 << (i)) - 1)
|
||||
#define AT91_MB_RX_SPLIT 8
|
||||
#define AT91_MB_RX_LOW_LAST (AT91_MB_RX_SPLIT - 1)
|
||||
#define AT91_MB_RX_LOW_MASK (AT91_MB_RX_MASK(AT91_MB_RX_SPLIT))
|
||||
#define AT91_MB_RX_LOW_MASK (AT91_MB_RX_MASK(AT91_MB_RX_SPLIT) & \
|
||||
~AT91_MB_RX_MASK(AT91_MB_RX_FIRST))
|
||||
|
||||
#define AT91_MB_TX_NUM (1 << AT91_MB_TX_SHIFT)
|
||||
#define AT91_MB_TX_FIRST (AT91_MB_RX_LAST + 1)
|
||||
@@ -168,6 +170,8 @@ struct at91_priv {
|
||||
|
||||
struct clk *clk;
|
||||
struct at91_can_data *pdata;
|
||||
|
||||
canid_t mb0_id;
|
||||
};
|
||||
|
||||
static struct can_bittiming_const at91_bittiming_const = {
|
||||
@@ -220,6 +224,18 @@ static inline void set_mb_mode(const struct at91_priv *priv, unsigned int mb,
|
||||
set_mb_mode_prio(priv, mb, mode, 0);
|
||||
}
|
||||
|
||||
static inline u32 at91_can_id_to_reg_mid(canid_t can_id)
|
||||
{
|
||||
u32 reg_mid;
|
||||
|
||||
if (can_id & CAN_EFF_FLAG)
|
||||
reg_mid = (can_id & CAN_EFF_MASK) | AT91_MID_MIDE;
|
||||
else
|
||||
reg_mid = (can_id & CAN_SFF_MASK) << 18;
|
||||
|
||||
return reg_mid;
|
||||
}
|
||||
|
||||
/*
|
||||
* Swtich transceiver on or off
|
||||
*/
|
||||
@@ -233,12 +249,22 @@ static void at91_setup_mailboxes(struct net_device *dev)
|
||||
{
|
||||
struct at91_priv *priv = netdev_priv(dev);
|
||||
unsigned int i;
|
||||
u32 reg_mid;
|
||||
|
||||
/*
|
||||
* The first 12 mailboxes are used as a reception FIFO. The
|
||||
* last mailbox is configured with overwrite option. The
|
||||
* overwrite flag indicates a FIFO overflow.
|
||||
* Due to a chip bug (errata 50.2.6.3 & 50.3.5.3) the first
|
||||
* mailbox is disabled. The next 11 mailboxes are used as a
|
||||
* reception FIFO. The last mailbox is configured with
|
||||
* overwrite option. The overwrite flag indicates a FIFO
|
||||
* overflow.
|
||||
*/
|
||||
reg_mid = at91_can_id_to_reg_mid(priv->mb0_id);
|
||||
for (i = 0; i < AT91_MB_RX_FIRST; i++) {
|
||||
set_mb_mode(priv, i, AT91_MB_MODE_DISABLED);
|
||||
at91_write(priv, AT91_MID(i), reg_mid);
|
||||
at91_write(priv, AT91_MCR(i), 0x0); /* clear dlc */
|
||||
}
|
||||
|
||||
for (i = AT91_MB_RX_FIRST; i < AT91_MB_RX_LAST; i++)
|
||||
set_mb_mode(priv, i, AT91_MB_MODE_RX);
|
||||
set_mb_mode(priv, AT91_MB_RX_LAST, AT91_MB_MODE_RX_OVRWR);
|
||||
@@ -254,7 +280,8 @@ static void at91_setup_mailboxes(struct net_device *dev)
|
||||
set_mb_mode_prio(priv, i, AT91_MB_MODE_TX, 0);
|
||||
|
||||
/* Reset tx and rx helper pointers */
|
||||
priv->tx_next = priv->tx_echo = priv->rx_next = 0;
|
||||
priv->tx_next = priv->tx_echo = 0;
|
||||
priv->rx_next = AT91_MB_RX_FIRST;
|
||||
}
|
||||
|
||||
static int at91_set_bittiming(struct net_device *dev)
|
||||
@@ -372,12 +399,7 @@ static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netdev_err(dev, "BUG! TX buffer full when queue awake!\n");
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
if (cf->can_id & CAN_EFF_FLAG)
|
||||
reg_mid = (cf->can_id & CAN_EFF_MASK) | AT91_MID_MIDE;
|
||||
else
|
||||
reg_mid = (cf->can_id & CAN_SFF_MASK) << 18;
|
||||
|
||||
reg_mid = at91_can_id_to_reg_mid(cf->can_id);
|
||||
reg_mcr = ((cf->can_id & CAN_RTR_FLAG) ? AT91_MCR_MRTR : 0) |
|
||||
(cf->can_dlc << 16) | AT91_MCR_MTCR;
|
||||
|
||||
@@ -539,27 +561,31 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb)
|
||||
*
|
||||
* Theory of Operation:
|
||||
*
|
||||
* 12 of the 16 mailboxes on the chip are reserved for RX. we split
|
||||
* them into 2 groups. The lower group holds 8 and upper 4 mailboxes.
|
||||
* 11 of the 16 mailboxes on the chip are reserved for RX. we split
|
||||
* them into 2 groups. The lower group holds 7 and upper 4 mailboxes.
|
||||
*
|
||||
* Like it or not, but the chip always saves a received CAN message
|
||||
* into the first free mailbox it finds (starting with the
|
||||
* lowest). This makes it very difficult to read the messages in the
|
||||
* right order from the chip. This is how we work around that problem:
|
||||
*
|
||||
* The first message goes into mb nr. 0 and issues an interrupt. All
|
||||
* The first message goes into mb nr. 1 and issues an interrupt. All
|
||||
* rx ints are disabled in the interrupt handler and a napi poll is
|
||||
* scheduled. We read the mailbox, but do _not_ reenable the mb (to
|
||||
* receive another message).
|
||||
*
|
||||
* lower mbxs upper
|
||||
* ______^______ __^__
|
||||
* / \ / \
|
||||
* ____^______ __^__
|
||||
* / \ / \
|
||||
* +-+-+-+-+-+-+-+-++-+-+-+-+
|
||||
* |x|x|x|x|x|x|x|x|| | | | |
|
||||
* | |x|x|x|x|x|x|x|| | | | |
|
||||
* +-+-+-+-+-+-+-+-++-+-+-+-+
|
||||
* 0 0 0 0 0 0 0 0 0 0 1 1 \ mail
|
||||
* 0 1 2 3 4 5 6 7 8 9 0 1 / box
|
||||
* ^
|
||||
* |
|
||||
* \
|
||||
* unused, due to chip bug
|
||||
*
|
||||
* The variable priv->rx_next points to the next mailbox to read a
|
||||
* message from. As long we're in the lower mailboxes we just read the
|
||||
@@ -590,10 +616,10 @@ static int at91_poll_rx(struct net_device *dev, int quota)
|
||||
"order of incoming frames cannot be guaranteed\n");
|
||||
|
||||
again:
|
||||
for (mb = find_next_bit(addr, AT91_MB_RX_NUM, priv->rx_next);
|
||||
mb < AT91_MB_RX_NUM && quota > 0;
|
||||
for (mb = find_next_bit(addr, AT91_MB_RX_LAST + 1, priv->rx_next);
|
||||
mb < AT91_MB_RX_LAST + 1 && quota > 0;
|
||||
reg_sr = at91_read(priv, AT91_SR),
|
||||
mb = find_next_bit(addr, AT91_MB_RX_NUM, ++priv->rx_next)) {
|
||||
mb = find_next_bit(addr, AT91_MB_RX_LAST + 1, ++priv->rx_next)) {
|
||||
at91_read_msg(dev, mb);
|
||||
|
||||
/* reactivate mailboxes */
|
||||
@@ -610,8 +636,8 @@ static int at91_poll_rx(struct net_device *dev, int quota)
|
||||
|
||||
/* upper group completed, look again in lower */
|
||||
if (priv->rx_next > AT91_MB_RX_LOW_LAST &&
|
||||
quota > 0 && mb >= AT91_MB_RX_NUM) {
|
||||
priv->rx_next = 0;
|
||||
quota > 0 && mb > AT91_MB_RX_LAST) {
|
||||
priv->rx_next = AT91_MB_RX_FIRST;
|
||||
goto again;
|
||||
}
|
||||
|
||||
@@ -1037,6 +1063,64 @@ static const struct net_device_ops at91_netdev_ops = {
|
||||
.ndo_start_xmit = at91_start_xmit,
|
||||
};
|
||||
|
||||
static ssize_t at91_sysfs_show_mb0_id(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct at91_priv *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
if (priv->mb0_id & CAN_EFF_FLAG)
|
||||
return snprintf(buf, PAGE_SIZE, "0x%08x\n", priv->mb0_id);
|
||||
else
|
||||
return snprintf(buf, PAGE_SIZE, "0x%03x\n", priv->mb0_id);
|
||||
}
|
||||
|
||||
static ssize_t at91_sysfs_set_mb0_id(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct net_device *ndev = to_net_dev(dev);
|
||||
struct at91_priv *priv = netdev_priv(ndev);
|
||||
unsigned long can_id;
|
||||
ssize_t ret;
|
||||
int err;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
if (ndev->flags & IFF_UP) {
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = strict_strtoul(buf, 0, &can_id);
|
||||
if (err) {
|
||||
ret = err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (can_id & CAN_EFF_FLAG)
|
||||
can_id &= CAN_EFF_MASK | CAN_EFF_FLAG;
|
||||
else
|
||||
can_id &= CAN_SFF_MASK;
|
||||
|
||||
priv->mb0_id = can_id;
|
||||
ret = count;
|
||||
|
||||
out:
|
||||
rtnl_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(mb0_id, S_IWUGO | S_IRUGO,
|
||||
at91_sysfs_show_mb0_id, at91_sysfs_set_mb0_id);
|
||||
|
||||
static struct attribute *at91_sysfs_attrs[] = {
|
||||
&dev_attr_mb0_id.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group at91_sysfs_attr_group = {
|
||||
.attrs = at91_sysfs_attrs,
|
||||
};
|
||||
|
||||
static int __devinit at91_can_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev;
|
||||
@@ -1082,6 +1166,7 @@ static int __devinit at91_can_probe(struct platform_device *pdev)
|
||||
dev->netdev_ops = &at91_netdev_ops;
|
||||
dev->irq = irq;
|
||||
dev->flags |= IFF_ECHO;
|
||||
dev->sysfs_groups[0] = &at91_sysfs_attr_group;
|
||||
|
||||
priv = netdev_priv(dev);
|
||||
priv->can.clock.freq = clk_get_rate(clk);
|
||||
@@ -1093,6 +1178,7 @@ static int __devinit at91_can_probe(struct platform_device *pdev)
|
||||
priv->dev = dev;
|
||||
priv->clk = clk;
|
||||
priv->pdata = pdev->dev.platform_data;
|
||||
priv->mb0_id = 0x7ff;
|
||||
|
||||
netif_napi_add(dev, &priv->napi, at91_poll, AT91_NAPI_WEIGHT);
|
||||
|
||||
|
||||
@@ -2247,7 +2247,7 @@ static void pch_gbe_remove(struct pci_dev *pdev)
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct pch_gbe_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
flush_scheduled_work();
|
||||
cancel_work_sync(&adapter->reset_task);
|
||||
unregister_netdev(netdev);
|
||||
|
||||
pch_gbe_hal_phy_hw_reset(&adapter->hw);
|
||||
|
||||
@@ -406,6 +406,7 @@ static int kaweth_download_firmware(struct kaweth_device *kaweth,
|
||||
|
||||
if (fw->size > KAWETH_FIRMWARE_BUF_SIZE) {
|
||||
err("Firmware too big: %zu", fw->size);
|
||||
release_firmware(fw);
|
||||
return -ENOSPC;
|
||||
}
|
||||
data_len = fw->size;
|
||||
|
||||
@@ -369,6 +369,9 @@ static void ath9k_hw_init_config(struct ath_hw *ah)
|
||||
else
|
||||
ah->config.ht_enable = 0;
|
||||
|
||||
/* PAPRD needs some more work to be enabled */
|
||||
ah->config.paprd_disable = 1;
|
||||
|
||||
ah->config.rx_intr_mitigation = true;
|
||||
ah->config.pcieSerDesWrite = true;
|
||||
|
||||
@@ -1933,7 +1936,8 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
|
||||
pCap->rx_status_len = sizeof(struct ar9003_rxs);
|
||||
pCap->tx_desc_len = sizeof(struct ar9003_txc);
|
||||
pCap->txs_len = sizeof(struct ar9003_txs);
|
||||
if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
|
||||
if (!ah->config.paprd_disable &&
|
||||
ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
|
||||
pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
|
||||
} else {
|
||||
pCap->tx_desc_len = sizeof(struct ath_desc);
|
||||
|
||||
@@ -225,6 +225,7 @@ struct ath9k_ops_config {
|
||||
u32 pcie_waen;
|
||||
u8 analog_shiftreg;
|
||||
u8 ht_enable;
|
||||
u8 paprd_disable;
|
||||
u32 ofdm_trig_low;
|
||||
u32 ofdm_trig_high;
|
||||
u32 cck_trig_high;
|
||||
|
||||
@@ -592,14 +592,12 @@ void ath9k_tasklet(unsigned long data)
|
||||
u32 status = sc->intrstatus;
|
||||
u32 rxmask;
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
|
||||
if (status & ATH9K_INT_FATAL) {
|
||||
ath_reset(sc, true);
|
||||
ath9k_ps_restore(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
spin_lock(&sc->sc_pcu_lock);
|
||||
|
||||
if (!ath9k_hw_check_alive(ah))
|
||||
@@ -969,6 +967,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
|
||||
/* Stop ANI */
|
||||
del_timer_sync(&common->ani.timer);
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
|
||||
ieee80211_stop_queues(hw);
|
||||
@@ -1015,6 +1014,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
|
||||
|
||||
/* Start ANI */
|
||||
ath_start_ani(common);
|
||||
ath9k_ps_restore(sc);
|
||||
|
||||
return r;
|
||||
}
|
||||
@@ -1701,7 +1701,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
||||
skip_chan_change:
|
||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||
sc->config.txpowlimit = 2 * conf->power_level;
|
||||
ath9k_ps_wakeup(sc);
|
||||
ath_update_txpow(sc);
|
||||
ath9k_ps_restore(sc);
|
||||
}
|
||||
|
||||
spin_lock_bh(&sc->wiphy_lock);
|
||||
|
||||
@@ -2113,9 +2113,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
|
||||
if (needreset) {
|
||||
ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
|
||||
"tx hung, resetting the chip\n");
|
||||
ath9k_ps_wakeup(sc);
|
||||
ath_reset(sc, true);
|
||||
ath9k_ps_restore(sc);
|
||||
}
|
||||
|
||||
ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,
|
||||
|
||||
@@ -2624,6 +2624,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
|
||||
.fw_name_pre = IWL4965_FW_PRE,
|
||||
.ucode_api_max = IWL4965_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL4965_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
|
||||
.valid_tx_ant = ANT_AB,
|
||||
.valid_rx_ant = ANT_ABC,
|
||||
.eeprom_ver = EEPROM_4965_EEPROM_VERSION,
|
||||
|
||||
@@ -152,11 +152,14 @@ int iwl_eeprom_check_sku(struct iwl_priv *priv)
|
||||
|
||||
eeprom_sku = iwl_eeprom_query16(priv, EEPROM_SKU_CAP);
|
||||
|
||||
priv->cfg->sku = ((eeprom_sku & EEPROM_SKU_CAP_BAND_SELECTION) >>
|
||||
if (!priv->cfg->sku) {
|
||||
/* not using sku overwrite */
|
||||
priv->cfg->sku =
|
||||
((eeprom_sku & EEPROM_SKU_CAP_BAND_SELECTION) >>
|
||||
EEPROM_SKU_CAP_BAND_POS);
|
||||
if (eeprom_sku & EEPROM_SKU_CAP_11N_ENABLE)
|
||||
priv->cfg->sku |= IWL_SKU_N;
|
||||
|
||||
if (eeprom_sku & EEPROM_SKU_CAP_11N_ENABLE)
|
||||
priv->cfg->sku |= IWL_SKU_N;
|
||||
}
|
||||
if (!priv->cfg->sku) {
|
||||
IWL_ERR(priv, "Invalid device sku\n");
|
||||
return -EINVAL;
|
||||
|
||||
@@ -2446,6 +2446,7 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||
{ USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x0812, 0x3101), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
/* Qcom */
|
||||
{ USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
{ USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||
|
||||
@@ -619,6 +619,13 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
||||
struct sk_buff *uskb = NULL;
|
||||
u8 *pdata;
|
||||
uskb = dev_alloc_skb(skb->len + 128);
|
||||
if (!uskb) {
|
||||
RT_TRACE(rtlpriv,
|
||||
(COMP_INTR | COMP_RECV),
|
||||
DBG_EMERG,
|
||||
("can't alloc rx skb\n"));
|
||||
goto done;
|
||||
}
|
||||
memcpy(IEEE80211_SKB_RXCB(uskb),
|
||||
&rx_status,
|
||||
sizeof(rx_status));
|
||||
@@ -641,7 +648,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
||||
new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
|
||||
if (unlikely(!new_skb)) {
|
||||
RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV),
|
||||
DBG_DMESG,
|
||||
DBG_EMERG,
|
||||
("can't alloc skb for rx\n"));
|
||||
goto done;
|
||||
}
|
||||
@@ -1066,9 +1073,9 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw)
|
||||
struct sk_buff *skb =
|
||||
dev_alloc_skb(rtlpci->rxbuffersize);
|
||||
u32 bufferaddress;
|
||||
entry = &rtlpci->rx_ring[rx_queue_idx].desc[i];
|
||||
if (!skb)
|
||||
return 0;
|
||||
entry = &rtlpci->rx_ring[rx_queue_idx].desc[i];
|
||||
|
||||
/*skb->dev = dev; */
|
||||
|
||||
|
||||
@@ -184,6 +184,7 @@ struct hci_conn {
|
||||
__u32 link_mode;
|
||||
__u8 auth_type;
|
||||
__u8 sec_level;
|
||||
__u8 pending_sec_level;
|
||||
__u8 power_save;
|
||||
__u16 disc_timeout;
|
||||
unsigned long pend;
|
||||
|
||||
+5
-5
@@ -13,7 +13,7 @@
|
||||
*
|
||||
* INTRODUCTION
|
||||
*
|
||||
* The textsearch infrastructure provides text searching facitilies for
|
||||
* The textsearch infrastructure provides text searching facilities for
|
||||
* both linear and non-linear data. Individual search algorithms are
|
||||
* implemented in modules and chosen by the user.
|
||||
*
|
||||
@@ -43,7 +43,7 @@
|
||||
* to the algorithm to store persistent variables.
|
||||
* (4) Core eventually resets the search offset and forwards the find()
|
||||
* request to the algorithm.
|
||||
* (5) Algorithm calls get_next_block() provided by the user continously
|
||||
* (5) Algorithm calls get_next_block() provided by the user continuously
|
||||
* to fetch the data to be searched in block by block.
|
||||
* (6) Algorithm invokes finish() after the last call to get_next_block
|
||||
* to clean up any leftovers from get_next_block. (Optional)
|
||||
@@ -58,15 +58,15 @@
|
||||
* the pattern to look for and flags. As a flag, you can set TS_IGNORECASE
|
||||
* to perform case insensitive matching. But it might slow down
|
||||
* performance of algorithm, so you should use it at own your risk.
|
||||
* The returned configuration may then be used for an arbitary
|
||||
* The returned configuration may then be used for an arbitrary
|
||||
* amount of times and even in parallel as long as a separate struct
|
||||
* ts_state variable is provided to every instance.
|
||||
*
|
||||
* The actual search is performed by either calling textsearch_find_-
|
||||
* continuous() for linear data or by providing an own get_next_block()
|
||||
* implementation and calling textsearch_find(). Both functions return
|
||||
* the position of the first occurrence of the patern or UINT_MAX if
|
||||
* no match was found. Subsequent occurences can be found by calling
|
||||
* the position of the first occurrence of the pattern or UINT_MAX if
|
||||
* no match was found. Subsequent occurrences can be found by calling
|
||||
* textsearch_next() regardless of the linearity of the data.
|
||||
*
|
||||
* Once you're done using a configuration it must be given back via
|
||||
|
||||
@@ -379,14 +379,10 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
|
||||
hci_conn_hold(acl);
|
||||
|
||||
if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
|
||||
acl->sec_level = sec_level;
|
||||
acl->sec_level = BT_SECURITY_LOW;
|
||||
acl->pending_sec_level = sec_level;
|
||||
acl->auth_type = auth_type;
|
||||
hci_acl_connect(acl);
|
||||
} else {
|
||||
if (acl->sec_level < sec_level)
|
||||
acl->sec_level = sec_level;
|
||||
if (acl->auth_type < auth_type)
|
||||
acl->auth_type = auth_type;
|
||||
}
|
||||
|
||||
if (type == ACL_LINK)
|
||||
@@ -442,11 +438,17 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
|
||||
{
|
||||
BT_DBG("conn %p", conn);
|
||||
|
||||
if (conn->pending_sec_level > sec_level)
|
||||
sec_level = conn->pending_sec_level;
|
||||
|
||||
if (sec_level > conn->sec_level)
|
||||
conn->sec_level = sec_level;
|
||||
conn->pending_sec_level = sec_level;
|
||||
else if (conn->link_mode & HCI_LM_AUTH)
|
||||
return 1;
|
||||
|
||||
/* Make sure we preserve an existing MITM requirement*/
|
||||
auth_type |= (conn->auth_type & 0x01);
|
||||
|
||||
conn->auth_type = auth_type;
|
||||
|
||||
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
|
||||
|
||||
@@ -1011,6 +1011,10 @@ int hci_unregister_dev(struct hci_dev *hdev)
|
||||
|
||||
destroy_workqueue(hdev->workqueue);
|
||||
|
||||
hci_dev_lock_bh(hdev);
|
||||
hci_blacklist_clear(hdev);
|
||||
hci_dev_unlock_bh(hdev);
|
||||
|
||||
__hci_dev_put(hdev);
|
||||
|
||||
return 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user