mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Kalle Valo says:
==================== pull-request: wireless-next-2022-10-28 First set of patches v6.2. mac80211 refactoring continues for Wi-Fi 7. All mac80211 driver are now converted to use internal TX queues, this might cause some regressions so we wanted to do this early in the cycle. Note: wireless tree was merged[1] to wireless-next to avoid some conflicts with mac80211 patches between the trees. Unfortunately there are still two smaller conflicts in net/mac80211/util.c which Stephen also reported[2]. In the first conflict initialise scratch_len to "params->scratch_len ?: 3 * params->len" (note number 3, not 2!) and in the second conflict take the version which uses elems->scratch_pos. [1] https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git/commit/?id=dfd2d876b3fda1790bc0239ba4c6967e25d16e91 [2] https://lore.kernel.org/all/20221020032340.5cf101c0@canb.auug.org.au/ mac80211 - preparation for Wi-Fi 7 Multi-Link Operation (MLO) continues - add API to show the link STAs in debugfs - all mac80211 drivers are now using mac80211 internal TX queues (iTXQs) rtw89 - support 8852BE rtl8xxxu - support RTL8188FU brmfmac - support two station interfaces concurrently bcma - support SPROM rev 11 ==================== Link: https://lore.kernel.org/r/20221028132943.304ECC433B5@smtp.kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -82,6 +82,7 @@ static void bcma_gpio_irq_unmask(struct irq_data *d)
|
||||
int gpio = irqd_to_hwirq(d);
|
||||
u32 val = bcma_chipco_gpio_in(cc, BIT(gpio));
|
||||
|
||||
gpiochip_enable_irq(gc, gpio);
|
||||
bcma_chipco_gpio_polarity(cc, BIT(gpio), val);
|
||||
bcma_chipco_gpio_intmask(cc, BIT(gpio), BIT(gpio));
|
||||
}
|
||||
@@ -93,12 +94,15 @@ static void bcma_gpio_irq_mask(struct irq_data *d)
|
||||
int gpio = irqd_to_hwirq(d);
|
||||
|
||||
bcma_chipco_gpio_intmask(cc, BIT(gpio), 0);
|
||||
gpiochip_disable_irq(gc, gpio);
|
||||
}
|
||||
|
||||
static struct irq_chip bcma_gpio_irq_chip = {
|
||||
static const struct irq_chip bcma_gpio_irq_chip = {
|
||||
.name = "BCMA-GPIO",
|
||||
.irq_mask = bcma_gpio_irq_mask,
|
||||
.irq_unmask = bcma_gpio_irq_unmask,
|
||||
.flags = IRQCHIP_IMMUTABLE,
|
||||
GPIOCHIP_IRQ_RESOURCE_HELPERS,
|
||||
};
|
||||
|
||||
static irqreturn_t bcma_gpio_irq_handler(int irq, void *dev_id)
|
||||
@@ -139,7 +143,7 @@ static int bcma_gpio_irq_init(struct bcma_drv_cc *cc)
|
||||
bcma_chipco_gpio_intmask(cc, ~0, 0);
|
||||
bcma_cc_set32(cc, BCMA_CC_IRQMASK, BCMA_CC_IRQ_GPIO);
|
||||
|
||||
girq->chip = &bcma_gpio_irq_chip;
|
||||
gpio_irq_chip_set_chip(girq, &bcma_gpio_irq_chip);
|
||||
/* This will let us handle the parent IRQ in the driver */
|
||||
girq->parent_handler = NULL;
|
||||
girq->num_parents = 0;
|
||||
|
||||
@@ -165,7 +165,7 @@ static int bcma_sprom_valid(struct bcma_bus *bus, const u16 *sprom,
|
||||
return err;
|
||||
|
||||
revision = sprom[words - 1] & SSB_SPROM_REVISION_REV;
|
||||
if (revision != 8 && revision != 9 && revision != 10) {
|
||||
if (revision < 8 || revision > 11) {
|
||||
pr_err("Unsupported SPROM revision: %d\n", revision);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@@ -1760,6 +1760,7 @@ static int adm8211_alloc_rings(struct ieee80211_hw *dev)
|
||||
|
||||
static const struct ieee80211_ops adm8211_ops = {
|
||||
.tx = adm8211_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.start = adm8211_start,
|
||||
.stop = adm8211_stop,
|
||||
.add_interface = adm8211_add_interface,
|
||||
|
||||
@@ -1355,6 +1355,7 @@ static const struct ieee80211_ops ar5523_ops = {
|
||||
.start = ar5523_start,
|
||||
.stop = ar5523_stop,
|
||||
.tx = ar5523_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.set_rts_threshold = ar5523_set_rts_threshold,
|
||||
.add_interface = ar5523_add_interface,
|
||||
.remove_interface = ar5523_remove_interface,
|
||||
|
||||
@@ -8539,6 +8539,7 @@ err_fallback:
|
||||
|
||||
static const struct ieee80211_ops ath11k_ops = {
|
||||
.tx = ath11k_mac_op_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.start = ath11k_mac_op_start,
|
||||
.stop = ath11k_mac_op_stop,
|
||||
.reconfig_complete = ath11k_mac_op_reconfig_complete,
|
||||
|
||||
@@ -781,6 +781,7 @@ static int ath5k_set_ringparam(struct ieee80211_hw *hw, u32 tx, u32 rx)
|
||||
|
||||
const struct ieee80211_ops ath5k_hw_ops = {
|
||||
.tx = ath5k_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.start = ath5k_start,
|
||||
.stop = ath5k_stop,
|
||||
.add_interface = ath5k_add_interface,
|
||||
|
||||
@@ -1870,6 +1870,7 @@ static void ath9k_htc_channel_switch_beacon(struct ieee80211_hw *hw,
|
||||
|
||||
struct ieee80211_ops ath9k_htc_ops = {
|
||||
.tx = ath9k_htc_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.start = ath9k_htc_start,
|
||||
.stop = ath9k_htc_stop,
|
||||
.add_interface = ath9k_htc_add_interface,
|
||||
|
||||
@@ -1715,6 +1715,7 @@ static const struct ieee80211_ops carl9170_ops = {
|
||||
.start = carl9170_op_start,
|
||||
.stop = carl9170_op_stop,
|
||||
.tx = carl9170_op_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.flush = carl9170_op_flush,
|
||||
.add_interface = carl9170_op_add_interface,
|
||||
.remove_interface = carl9170_op_remove_interface,
|
||||
|
||||
@@ -1361,6 +1361,7 @@ static const struct ieee80211_ops wcn36xx_ops = {
|
||||
.prepare_multicast = wcn36xx_prepare_multicast,
|
||||
.configure_filter = wcn36xx_configure_filter,
|
||||
.tx = wcn36xx_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.set_key = wcn36xx_set_key,
|
||||
.hw_scan = wcn36xx_hw_scan,
|
||||
.cancel_hw_scan = wcn36xx_cancel_hw_scan,
|
||||
|
||||
@@ -2179,6 +2179,7 @@ static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
|
||||
static const struct ieee80211_ops at76_ops = {
|
||||
.tx = at76_mac80211_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.add_interface = at76_add_interface,
|
||||
.remove_interface = at76_remove_interface,
|
||||
.config = at76_config,
|
||||
|
||||
@@ -1643,9 +1643,10 @@ EXPORT_SYMBOL(stop_atmel_card);
|
||||
|
||||
static int atmel_set_essid(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_point *dwrq = &wrqu->essid;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
/* Check if we asked for `any' */
|
||||
@@ -1671,9 +1672,10 @@ static int atmel_set_essid(struct net_device *dev,
|
||||
|
||||
static int atmel_get_essid(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_point *dwrq = &wrqu->essid;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
/* Get the current SSID */
|
||||
@@ -1692,9 +1694,10 @@ static int atmel_get_essid(struct net_device *dev,
|
||||
|
||||
static int atmel_get_wap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct sockaddr *awrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct sockaddr *awrq = &wrqu->ap_addr;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
memcpy(awrq->sa_data, priv->CurrentBSSID, ETH_ALEN);
|
||||
awrq->sa_family = ARPHRD_ETHER;
|
||||
@@ -1704,9 +1707,10 @@ static int atmel_get_wap(struct net_device *dev,
|
||||
|
||||
static int atmel_set_encode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_point *dwrq = &wrqu->encoding;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
/* Basic checking: do we have a key to set ?
|
||||
@@ -1793,9 +1797,10 @@ static int atmel_set_encode(struct net_device *dev,
|
||||
|
||||
static int atmel_get_encode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_point *dwrq = &wrqu->encoding;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
|
||||
|
||||
@@ -2003,18 +2008,19 @@ static int atmel_get_auth(struct net_device *dev,
|
||||
|
||||
static int atmel_get_name(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
char *cwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
strcpy(cwrq, "IEEE 802.11-DS");
|
||||
strcpy(wrqu->name, "IEEE 802.11-DS");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int atmel_set_rate(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->bitrate;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
if (vwrq->fixed == 0) {
|
||||
@@ -2053,9 +2059,10 @@ static int atmel_set_rate(struct net_device *dev,
|
||||
|
||||
static int atmel_set_mode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
__u32 *uwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
__u32 *uwrq = &wrqu->mode;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
if (*uwrq != IW_MODE_ADHOC && *uwrq != IW_MODE_INFRA)
|
||||
@@ -2067,9 +2074,10 @@ static int atmel_set_mode(struct net_device *dev,
|
||||
|
||||
static int atmel_get_mode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
__u32 *uwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
__u32 *uwrq = &wrqu->mode;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
*uwrq = priv->operating_mode;
|
||||
@@ -2078,9 +2086,10 @@ static int atmel_get_mode(struct net_device *dev,
|
||||
|
||||
static int atmel_get_rate(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->bitrate;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
if (priv->auto_tx_rate) {
|
||||
@@ -2108,9 +2117,10 @@ static int atmel_get_rate(struct net_device *dev,
|
||||
|
||||
static int atmel_set_power(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->power;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
priv->power_mode = vwrq->disabled ? 0 : 1;
|
||||
return -EINPROGRESS;
|
||||
@@ -2118,9 +2128,10 @@ static int atmel_set_power(struct net_device *dev,
|
||||
|
||||
static int atmel_get_power(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->power;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
vwrq->disabled = priv->power_mode ? 0 : 1;
|
||||
vwrq->flags = IW_POWER_ON;
|
||||
@@ -2129,9 +2140,10 @@ static int atmel_get_power(struct net_device *dev,
|
||||
|
||||
static int atmel_set_retry(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->retry;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
if (!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) {
|
||||
@@ -2152,9 +2164,10 @@ static int atmel_set_retry(struct net_device *dev,
|
||||
|
||||
static int atmel_get_retry(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->retry;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
vwrq->disabled = 0; /* Can't be disabled */
|
||||
@@ -2175,9 +2188,10 @@ static int atmel_get_retry(struct net_device *dev,
|
||||
|
||||
static int atmel_set_rts(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->rts;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
int rthr = vwrq->value;
|
||||
|
||||
@@ -2193,9 +2207,10 @@ static int atmel_set_rts(struct net_device *dev,
|
||||
|
||||
static int atmel_get_rts(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->rts;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
vwrq->value = priv->rts_threshold;
|
||||
@@ -2207,9 +2222,10 @@ static int atmel_get_rts(struct net_device *dev,
|
||||
|
||||
static int atmel_set_frag(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->frag;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
int fthr = vwrq->value;
|
||||
|
||||
@@ -2226,9 +2242,10 @@ static int atmel_set_frag(struct net_device *dev,
|
||||
|
||||
static int atmel_get_frag(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *vwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_param *vwrq = &wrqu->frag;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
vwrq->value = priv->frag_threshold;
|
||||
@@ -2240,9 +2257,10 @@ static int atmel_get_frag(struct net_device *dev,
|
||||
|
||||
static int atmel_set_freq(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_freq *fwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_freq *fwrq = &wrqu->freq;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
int rc = -EINPROGRESS; /* Call commit handler */
|
||||
|
||||
@@ -2270,9 +2288,10 @@ static int atmel_set_freq(struct net_device *dev,
|
||||
|
||||
static int atmel_get_freq(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_freq *fwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_freq *fwrq = &wrqu->freq;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
|
||||
fwrq->m = priv->channel;
|
||||
@@ -2282,7 +2301,7 @@ static int atmel_get_freq(struct net_device *dev,
|
||||
|
||||
static int atmel_set_scan(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *dwrq,
|
||||
char *extra)
|
||||
{
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
@@ -2320,9 +2339,10 @@ static int atmel_set_scan(struct net_device *dev,
|
||||
|
||||
static int atmel_get_scan(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_point *dwrq = &wrqu->data;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
int i;
|
||||
char *current_ev = extra;
|
||||
@@ -2391,9 +2411,10 @@ static int atmel_get_scan(struct net_device *dev,
|
||||
|
||||
static int atmel_get_range(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *dwrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct iw_point *dwrq = &wrqu->data;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
struct iw_range *range = (struct iw_range *) extra;
|
||||
int k, i, j;
|
||||
@@ -2465,9 +2486,10 @@ static int atmel_get_range(struct net_device *dev,
|
||||
|
||||
static int atmel_set_wap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct sockaddr *awrq,
|
||||
union iwreq_data *wrqu,
|
||||
char *extra)
|
||||
{
|
||||
struct sockaddr *awrq = &wrqu->ap_addr;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
int i;
|
||||
static const u8 any[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
@@ -2507,7 +2529,7 @@ static int atmel_set_wap(struct net_device *dev,
|
||||
|
||||
static int atmel_config_commit(struct net_device *dev,
|
||||
struct iw_request_info *info, /* NULL */
|
||||
void *zwrq, /* NULL */
|
||||
union iwreq_data *zwrq, /* NULL */
|
||||
char *extra) /* NULL */
|
||||
{
|
||||
return atmel_open(dev);
|
||||
@@ -2515,66 +2537,40 @@ static int atmel_config_commit(struct net_device *dev,
|
||||
|
||||
static const iw_handler atmel_handler[] =
|
||||
{
|
||||
(iw_handler) atmel_config_commit, /* SIOCSIWCOMMIT */
|
||||
(iw_handler) atmel_get_name, /* SIOCGIWNAME */
|
||||
(iw_handler) NULL, /* SIOCSIWNWID */
|
||||
(iw_handler) NULL, /* SIOCGIWNWID */
|
||||
(iw_handler) atmel_set_freq, /* SIOCSIWFREQ */
|
||||
(iw_handler) atmel_get_freq, /* SIOCGIWFREQ */
|
||||
(iw_handler) atmel_set_mode, /* SIOCSIWMODE */
|
||||
(iw_handler) atmel_get_mode, /* SIOCGIWMODE */
|
||||
(iw_handler) NULL, /* SIOCSIWSENS */
|
||||
(iw_handler) NULL, /* SIOCGIWSENS */
|
||||
(iw_handler) NULL, /* SIOCSIWRANGE */
|
||||
(iw_handler) atmel_get_range, /* SIOCGIWRANGE */
|
||||
(iw_handler) NULL, /* SIOCSIWPRIV */
|
||||
(iw_handler) NULL, /* SIOCGIWPRIV */
|
||||
(iw_handler) NULL, /* SIOCSIWSTATS */
|
||||
(iw_handler) NULL, /* SIOCGIWSTATS */
|
||||
(iw_handler) NULL, /* SIOCSIWSPY */
|
||||
(iw_handler) NULL, /* SIOCGIWSPY */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) atmel_set_wap, /* SIOCSIWAP */
|
||||
(iw_handler) atmel_get_wap, /* SIOCGIWAP */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* SIOCGIWAPLIST */
|
||||
(iw_handler) atmel_set_scan, /* SIOCSIWSCAN */
|
||||
(iw_handler) atmel_get_scan, /* SIOCGIWSCAN */
|
||||
(iw_handler) atmel_set_essid, /* SIOCSIWESSID */
|
||||
(iw_handler) atmel_get_essid, /* SIOCGIWESSID */
|
||||
(iw_handler) NULL, /* SIOCSIWNICKN */
|
||||
(iw_handler) NULL, /* SIOCGIWNICKN */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) atmel_set_rate, /* SIOCSIWRATE */
|
||||
(iw_handler) atmel_get_rate, /* SIOCGIWRATE */
|
||||
(iw_handler) atmel_set_rts, /* SIOCSIWRTS */
|
||||
(iw_handler) atmel_get_rts, /* SIOCGIWRTS */
|
||||
(iw_handler) atmel_set_frag, /* SIOCSIWFRAG */
|
||||
(iw_handler) atmel_get_frag, /* SIOCGIWFRAG */
|
||||
(iw_handler) NULL, /* SIOCSIWTXPOW */
|
||||
(iw_handler) NULL, /* SIOCGIWTXPOW */
|
||||
(iw_handler) atmel_set_retry, /* SIOCSIWRETRY */
|
||||
(iw_handler) atmel_get_retry, /* SIOCGIWRETRY */
|
||||
(iw_handler) atmel_set_encode, /* SIOCSIWENCODE */
|
||||
(iw_handler) atmel_get_encode, /* SIOCGIWENCODE */
|
||||
(iw_handler) atmel_set_power, /* SIOCSIWPOWER */
|
||||
(iw_handler) atmel_get_power, /* SIOCGIWPOWER */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* -- hole -- */
|
||||
(iw_handler) NULL, /* SIOCSIWGENIE */
|
||||
(iw_handler) NULL, /* SIOCGIWGENIE */
|
||||
(iw_handler) atmel_set_auth, /* SIOCSIWAUTH */
|
||||
(iw_handler) atmel_get_auth, /* SIOCGIWAUTH */
|
||||
(iw_handler) atmel_set_encodeext, /* SIOCSIWENCODEEXT */
|
||||
(iw_handler) atmel_get_encodeext, /* SIOCGIWENCODEEXT */
|
||||
(iw_handler) NULL, /* SIOCSIWPMKSA */
|
||||
IW_HANDLER(SIOCSIWCOMMIT, atmel_config_commit),
|
||||
IW_HANDLER(SIOCGIWNAME, atmel_get_name),
|
||||
IW_HANDLER(SIOCSIWFREQ, atmel_set_freq),
|
||||
IW_HANDLER(SIOCGIWFREQ, atmel_get_freq),
|
||||
IW_HANDLER(SIOCSIWMODE, atmel_set_mode),
|
||||
IW_HANDLER(SIOCGIWMODE, atmel_get_mode),
|
||||
IW_HANDLER(SIOCGIWRANGE, atmel_get_range),
|
||||
IW_HANDLER(SIOCSIWAP, atmel_set_wap),
|
||||
IW_HANDLER(SIOCGIWAP, atmel_get_wap),
|
||||
IW_HANDLER(SIOCSIWSCAN, atmel_set_scan),
|
||||
IW_HANDLER(SIOCGIWSCAN, atmel_get_scan),
|
||||
IW_HANDLER(SIOCSIWESSID, atmel_set_essid),
|
||||
IW_HANDLER(SIOCGIWESSID, atmel_get_essid),
|
||||
IW_HANDLER(SIOCSIWRATE, atmel_set_rate),
|
||||
IW_HANDLER(SIOCGIWRATE, atmel_get_rate),
|
||||
IW_HANDLER(SIOCSIWRTS, atmel_set_rts),
|
||||
IW_HANDLER(SIOCGIWRTS, atmel_get_rts),
|
||||
IW_HANDLER(SIOCSIWFRAG, atmel_set_frag),
|
||||
IW_HANDLER(SIOCGIWFRAG, atmel_get_frag),
|
||||
IW_HANDLER(SIOCSIWRETRY, atmel_set_retry),
|
||||
IW_HANDLER(SIOCGIWRETRY, atmel_get_retry),
|
||||
IW_HANDLER(SIOCSIWENCODE, atmel_set_encode),
|
||||
IW_HANDLER(SIOCGIWENCODE, atmel_get_encode),
|
||||
IW_HANDLER(SIOCSIWPOWER, atmel_set_power),
|
||||
IW_HANDLER(SIOCGIWPOWER, atmel_get_power),
|
||||
IW_HANDLER(SIOCSIWAUTH, atmel_set_auth),
|
||||
IW_HANDLER(SIOCGIWAUTH, atmel_get_auth),
|
||||
IW_HANDLER(SIOCSIWENCODEEXT, atmel_set_encodeext),
|
||||
IW_HANDLER(SIOCGIWENCODEEXT, atmel_get_encodeext),
|
||||
};
|
||||
|
||||
static const iw_handler atmel_private_handler[] =
|
||||
{
|
||||
NULL, /* SIOCIWFIRSTPRIV */
|
||||
IW_HANDLER(SIOCIWFIRSTPRIV, NULL),
|
||||
};
|
||||
|
||||
struct atmel_priv_ioctl {
|
||||
@@ -2614,8 +2610,8 @@ static const struct iw_handler_def atmel_handler_def = {
|
||||
.num_standard = ARRAY_SIZE(atmel_handler),
|
||||
.num_private = ARRAY_SIZE(atmel_private_handler),
|
||||
.num_private_args = ARRAY_SIZE(atmel_private_args),
|
||||
.standard = (iw_handler *) atmel_handler,
|
||||
.private = (iw_handler *) atmel_private_handler,
|
||||
.standard = atmel_handler,
|
||||
.private = atmel_private_handler,
|
||||
.private_args = (struct iw_priv_args *) atmel_private_args,
|
||||
.get_wireless_stats = atmel_get_wireless_stats
|
||||
};
|
||||
|
||||
@@ -5171,6 +5171,7 @@ static int b43_op_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
|
||||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.conf_tx = b43_op_conf_tx,
|
||||
.add_interface = b43_op_add_interface,
|
||||
.remove_interface = b43_op_remove_interface,
|
||||
|
||||
@@ -3532,6 +3532,7 @@ static int b43legacy_op_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
|
||||
static const struct ieee80211_ops b43legacy_hw_ops = {
|
||||
.tx = b43legacy_op_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.conf_tx = b43legacy_op_conf_tx,
|
||||
.add_interface = b43legacy_op_add_interface,
|
||||
.remove_interface = b43legacy_op_remove_interface,
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
#define BRCMF_NROF_COMMON_MSGRINGS (BRCMF_NROF_H2D_COMMON_MSGRINGS + \
|
||||
BRCMF_NROF_D2H_COMMON_MSGRINGS)
|
||||
|
||||
/* The interval to poll console */
|
||||
#define BRCMF_CONSOLE 10
|
||||
|
||||
/* The maximum console interval value (5 mins) */
|
||||
#define MAX_CONSOLE_INTERVAL (5 * 60)
|
||||
|
||||
/* The level of bus communication with the dongle */
|
||||
enum brcmf_bus_state {
|
||||
BRCMF_BUS_DOWN, /* Not ready for frame transfers */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1399,7 +1399,8 @@ void brcmf_fw_crashed(struct device *dev)
|
||||
|
||||
brcmf_dev_coredump(dev);
|
||||
|
||||
schedule_work(&drvr->bus_reset);
|
||||
if (drvr->bus_reset.func)
|
||||
schedule_work(&drvr->bus_reset);
|
||||
}
|
||||
|
||||
void brcmf_detach(struct device *dev)
|
||||
|
||||
@@ -136,6 +136,7 @@ struct brcmf_pub {
|
||||
struct work_struct bus_reset;
|
||||
|
||||
u8 clmver[BRCMF_DCMD_SMLEN];
|
||||
u8 sta_mac_idx;
|
||||
};
|
||||
|
||||
/* forward declarations */
|
||||
|
||||
@@ -143,7 +143,7 @@ static void brcmf_feat_iovar_int_get(struct brcmf_if *ifp,
|
||||
ifp->fwil_fwerr = true;
|
||||
|
||||
err = brcmf_fil_iovar_int_get(ifp, name, &data);
|
||||
if (err == 0) {
|
||||
if (err != -BRCMF_FW_UNSUPPORTED) {
|
||||
brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]);
|
||||
ifp->drvr->feat_flags |= BIT(id);
|
||||
} else {
|
||||
@@ -281,6 +281,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp");
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_DUMP_OBSS, "dump_obss");
|
||||
|
||||
pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
|
||||
err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac,
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
* DOT11H: firmware supports 802.11h
|
||||
* SAE: simultaneous authentication of equals
|
||||
* FWAUTH: Firmware authenticator
|
||||
* DUMP_OBSS: Firmware has capable to dump obss info to support ACS
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -51,7 +52,8 @@
|
||||
BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
|
||||
BRCMF_FEAT_DEF(DOT11H) \
|
||||
BRCMF_FEAT_DEF(SAE) \
|
||||
BRCMF_FEAT_DEF(FWAUTH)
|
||||
BRCMF_FEAT_DEF(FWAUTH) \
|
||||
BRCMF_FEAT_DEF(DUMP_OBSS)
|
||||
|
||||
/*
|
||||
* Quirks:
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
@@ -340,6 +342,11 @@ struct brcmf_pciedev_info {
|
||||
u16 value);
|
||||
struct brcmf_mp_device *settings;
|
||||
struct brcmf_otp_params otp;
|
||||
#ifdef DEBUG
|
||||
u32 console_interval;
|
||||
bool console_active;
|
||||
struct timer_list timer;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct brcmf_pcie_ringbuf {
|
||||
@@ -440,6 +447,9 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
struct brcmf_fw_request *fwreq);
|
||||
static struct brcmf_fw_request *
|
||||
brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
|
||||
static void
|
||||
brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active);
|
||||
static void brcmf_pcie_debugfs_create(struct device *dev);
|
||||
|
||||
static u16
|
||||
brcmf_pcie_read_reg16(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
|
||||
@@ -1218,6 +1228,10 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
|
||||
BRCMF_NROF_H2D_COMMON_MSGRINGS;
|
||||
max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS;
|
||||
}
|
||||
if (max_flowrings > 256) {
|
||||
brcmf_err(bus, "invalid max_flowrings(%d)\n", max_flowrings);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (devinfo->dma_idx_sz != 0) {
|
||||
bufsz = (max_submissionrings + max_completionrings) *
|
||||
@@ -1413,6 +1427,11 @@ fail:
|
||||
|
||||
static void brcmf_pcie_down(struct device *dev)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
|
||||
struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
|
||||
|
||||
brcmf_pcie_fwcon_timer(devinfo, false);
|
||||
}
|
||||
|
||||
static int brcmf_pcie_preinit(struct device *dev)
|
||||
@@ -1547,6 +1566,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
.get_memdump = brcmf_pcie_get_memdump,
|
||||
.get_blob = brcmf_pcie_get_blob,
|
||||
.reset = brcmf_pcie_reset,
|
||||
.debugfs_create = brcmf_pcie_debugfs_create,
|
||||
};
|
||||
|
||||
|
||||
@@ -2048,13 +2068,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
struct brcmf_commonring **flowrings;
|
||||
u32 i, nvram_len;
|
||||
|
||||
bus = dev_get_drvdata(dev);
|
||||
pcie_bus_dev = bus->bus_priv.pcie;
|
||||
devinfo = pcie_bus_dev->devinfo;
|
||||
|
||||
/* check firmware loading result */
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
bus = dev_get_drvdata(dev);
|
||||
pcie_bus_dev = bus->bus_priv.pcie;
|
||||
devinfo = pcie_bus_dev->devinfo;
|
||||
brcmf_pcie_attach(devinfo);
|
||||
|
||||
fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
|
||||
@@ -2123,9 +2144,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
|
||||
brcmf_pcie_bus_console_read(devinfo, false);
|
||||
|
||||
brcmf_pcie_fwcon_timer(devinfo, true);
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
brcmf_err(bus, "Dongle setup failed\n");
|
||||
brcmf_pcie_bus_console_read(devinfo, true);
|
||||
brcmf_fw_crashed(dev);
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
@@ -2197,6 +2223,105 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
return fwreq;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static void
|
||||
brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
|
||||
{
|
||||
if (!active) {
|
||||
if (devinfo->console_active) {
|
||||
del_timer_sync(&devinfo->timer);
|
||||
devinfo->console_active = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* don't start the timer */
|
||||
if (devinfo->state != BRCMFMAC_PCIE_STATE_UP ||
|
||||
!devinfo->console_interval || !BRCMF_FWCON_ON())
|
||||
return;
|
||||
|
||||
if (!devinfo->console_active) {
|
||||
devinfo->timer.expires = jiffies + devinfo->console_interval;
|
||||
add_timer(&devinfo->timer);
|
||||
devinfo->console_active = true;
|
||||
} else {
|
||||
/* Reschedule the timer */
|
||||
mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
brcmf_pcie_fwcon(struct timer_list *t)
|
||||
{
|
||||
struct brcmf_pciedev_info *devinfo = from_timer(devinfo, t, timer);
|
||||
|
||||
if (!devinfo->console_active)
|
||||
return;
|
||||
|
||||
brcmf_pcie_bus_console_read(devinfo, false);
|
||||
|
||||
/* Reschedule the timer if console interval is not zero */
|
||||
mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
|
||||
}
|
||||
|
||||
static int brcmf_pcie_console_interval_get(void *data, u64 *val)
|
||||
{
|
||||
struct brcmf_pciedev_info *devinfo = data;
|
||||
|
||||
*val = devinfo->console_interval;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int brcmf_pcie_console_interval_set(void *data, u64 val)
|
||||
{
|
||||
struct brcmf_pciedev_info *devinfo = data;
|
||||
|
||||
if (val > MAX_CONSOLE_INTERVAL)
|
||||
return -EINVAL;
|
||||
|
||||
devinfo->console_interval = val;
|
||||
|
||||
if (!val && devinfo->console_active)
|
||||
brcmf_pcie_fwcon_timer(devinfo, false);
|
||||
else if (val)
|
||||
brcmf_pcie_fwcon_timer(devinfo, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(brcmf_pcie_console_interval_fops,
|
||||
brcmf_pcie_console_interval_get,
|
||||
brcmf_pcie_console_interval_set,
|
||||
"%llu\n");
|
||||
|
||||
static void brcmf_pcie_debugfs_create(struct device *dev)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pub *drvr = bus_if->drvr;
|
||||
struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
|
||||
struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
|
||||
struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
|
||||
|
||||
if (IS_ERR_OR_NULL(dentry))
|
||||
return;
|
||||
|
||||
devinfo->console_interval = BRCMF_CONSOLE;
|
||||
|
||||
debugfs_create_file("console_interval", 0644, dentry, devinfo,
|
||||
&brcmf_pcie_console_interval_fops);
|
||||
}
|
||||
|
||||
#else
|
||||
void brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
|
||||
{
|
||||
}
|
||||
|
||||
static void brcmf_pcie_debugfs_create(struct device *dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
@@ -2278,6 +2403,11 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
goto fail_brcmf;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
/* Set up the fwcon timer */
|
||||
timer_setup(&devinfo->timer, brcmf_pcie_fwcon, 0);
|
||||
#endif
|
||||
|
||||
fwreq = brcmf_pcie_prepare_fw_request(devinfo);
|
||||
if (!fwreq) {
|
||||
ret = -ENOMEM;
|
||||
@@ -2323,6 +2453,7 @@ brcmf_pcie_remove(struct pci_dev *pdev)
|
||||
|
||||
devinfo = bus->bus_priv.pcie->devinfo;
|
||||
brcmf_pcie_bus_console_read(devinfo, false);
|
||||
brcmf_pcie_fwcon_timer(devinfo, false);
|
||||
|
||||
devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
|
||||
if (devinfo->ci)
|
||||
@@ -2366,6 +2497,7 @@ static int brcmf_pcie_pm_enter_D3(struct device *dev)
|
||||
bus = dev_get_drvdata(dev);
|
||||
devinfo = bus->bus_priv.pcie->devinfo;
|
||||
|
||||
brcmf_pcie_fwcon_timer(devinfo, false);
|
||||
brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
|
||||
|
||||
devinfo->mbdata_completed = false;
|
||||
@@ -2409,6 +2541,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
|
||||
brcmf_bus_change_state(bus, BRCMF_BUS_UP);
|
||||
brcmf_pcie_intr_enable(devinfo);
|
||||
brcmf_pcie_hostready(devinfo);
|
||||
brcmf_pcie_fwcon_timer(devinfo, true);
|
||||
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