* Re: /proc/net/dev regression
From: Al Viro @ 2015-01-11 1:39 UTC (permalink / raw)
To: Carlos R. Mafra; +Cc: LKML, Hauke Mehrtens, John W. Linville, netdev
In-Reply-To: <20150111013335.GA5753@linux-g29b.site>
On Sun, Jan 11, 2015 at 01:33:35AM +0000, Carlos R. Mafra wrote:
> I think the problem with wmnet is not that it was expecting the fields
> to be aligned because it never had problems before (when definitely more
> than 10 megabytes were received, wmnet is crappy but not _that_ crappy).
>
> I think the problem really was here,
>
> totalbytes_in = strtoul(&buffer[7], NULL, 10);
>
> After the patch the device name is 8 characters long and &buffer[7]
> overlaps with the name instead of reading the bytes. Before the
> patch is was fine because the call to strtoul() seems correct in the
> sense that it would read everything until the NULL. So more than 10
> megabytes was still ok.
>
> So I guess I was wrong when suggesting that the problem was the
> alignment.
Several lines below there's this:
totalpackets_out = strtoul(&buffer[74], NULL, 10);
if (totalpackets_out != lastpackets_out) {
totalbytes_out = strtoul(&buffer[66], NULL, 10);
diffpackets_out += totalpackets_out - lastpackets_out;
diffbytes_out += totalbytes_out - lastbytes_out;
lastpackets_out = totalpackets_out;
lastbytes_out = totalbytes_out;
tx = True;
}
So I'm afraid it *is* that crappy. This function really should use scanf();
note that updateStats_ipchains() in the same file does just that (well,
fgets()+sscanf() for fsck knows what reason). And I'd be careful with all
those %d, actually - it's not _that_ hard to get more than 4Gb sent.
scanf formats really ought to match the kernel-side (seq_)printf one...
^ permalink raw reply
* Re: /proc/net/dev regression
From: Carlos R. Mafra @ 2015-01-11 1:33 UTC (permalink / raw)
To: Al Viro; +Cc: LKML, Hauke Mehrtens, John W. Linville, netdev
In-Reply-To: <20150111010036.GD22149@ZenIV.linux.org.uk>
On Sun, 11 Jan 2015 at 1:00:36 +0000, Al Viro wrote:
> On Sun, Jan 11, 2015 at 12:27:06AM +0000, Al Viro wrote:
> > On Sat, Jan 10, 2015 at 11:25:18PM +0000, Carlos R. Mafra wrote:
> > > [mafra@linux-g29b:wmnet]$ cat net_dev_bad.txt
> > > Inter-| Receive | Transmit
> > > face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
> > > lo: 600 8 0 0 0 0 0 0 600 8 0 0 0 0 0 0
> > > wlp3s0b1: 9266848 7298 0 0 0 0 0 0 372229 4030 0 0 0 0 0 0
> > >
> > > And for some reason this change confuses 'wmnet'. Reading the source code
> > > of 'wmnet' I found that it reads the packets as follows,
> > >
> > > totalpackets_in = strtoul(&buffer[15], NULL, 10);
> > >
> > > I am not sure if 'wmnet' could do this better (any suggestions?),
> >
> > *snort*
> >
> > well, yes - it's called scanf(). And if one is really, really nervous
> > about the overhead of <gasp> parsing a bunch of integers (as if fopen/
> > fgets/fclose alone won't cost enough to make constantly calling that
> > sucker a bad idea), just use ptr + <something> - 6 instead of
> > &buffer[<something>] in there. That thing has just found where the
> > colon was (and replaced it with NUL), so dealing with "the first field
> > turned out to be too long and shifted everything past it" isn't hard.
> >
> > > but the fact is that it was working before and now it is not.
> >
> > True. Mind you, the real issue is that this code expects the interface
> > names to be never longer than 6 characters, but then /proc/net/dev layout
> > strongly suggests that. Hell knows; it is a regression and it does
> > break real-world userland code. The only way to avoid that, AFAICS, is
> > to prohibit interface names longer than 6 chars ;-/
> >
> > Lovely combination of crappy ABI (procfs file layout), crappy userland
> > code relying on details of said ABI out of sheer laziness and triggering
> > kernel change producing bloody long interface names...
> >
> > Incidentally, sufficiently long interface name will produce other fun issues
> > for a docked app - it simply won't fit into 64x64 square on screen ;-)
>
> Mind you, assuming that columns will align is obviously broken - the producing
> side of that thing is
> seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "
> "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",
> dev->name, stats->rx_bytes, stats->rx_packets,
> stats->rx_errors,
> stats->rx_dropped + stats->rx_missed_errors,
> stats->rx_fifo_errors,
> stats->rx_length_errors + stats->rx_over_errors +
> stats->rx_crc_errors + stats->rx_frame_errors,
> stats->rx_compressed, stats->multicast,
> stats->tx_bytes, stats->tx_packets,
> stats->tx_errors, stats->tx_dropped,
> stats->tx_fifo_errors, stats->collisions,
> stats->tx_carrier_errors +
> stats->tx_aborted_errors +
> stats->tx_window_errors +
> stats->tx_heartbeat_errors,
> stats->tx_compressed);
> To start with, expecting the ->rx_bytes to remain a 7-digit number is somewhat,
> er, odd. Long interace names be damned, the columns will not stay aligned,
> no matter what. Unless your interface vanishes as soon as it has sent
> or received 10 megabytes, that is...
I think the problem with wmnet is not that it was expecting the fields
to be aligned because it never had problems before (when definitely more
than 10 megabytes were received, wmnet is crappy but not _that_ crappy).
I think the problem really was here,
totalbytes_in = strtoul(&buffer[7], NULL, 10);
After the patch the device name is 8 characters long and &buffer[7]
overlaps with the name instead of reading the bytes. Before the
patch is was fine because the call to strtoul() seems correct in the
sense that it would read everything until the NULL. So more than 10
megabytes was still ok.
So I guess I was wrong when suggesting that the problem was the
alignment.
^ permalink raw reply
* Re: /proc/net/dev regression
From: Al Viro @ 2015-01-11 1:00 UTC (permalink / raw)
To: Carlos R. Mafra; +Cc: LKML, Hauke Mehrtens, John W. Linville, netdev
In-Reply-To: <20150111002706.GC22149@ZenIV.linux.org.uk>
On Sun, Jan 11, 2015 at 12:27:06AM +0000, Al Viro wrote:
> On Sat, Jan 10, 2015 at 11:25:18PM +0000, Carlos R. Mafra wrote:
> > [mafra@linux-g29b:wmnet]$ cat net_dev_bad.txt
> > Inter-| Receive | Transmit
> > face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
> > lo: 600 8 0 0 0 0 0 0 600 8 0 0 0 0 0 0
> > wlp3s0b1: 9266848 7298 0 0 0 0 0 0 372229 4030 0 0 0 0 0 0
> >
> > And for some reason this change confuses 'wmnet'. Reading the source code
> > of 'wmnet' I found that it reads the packets as follows,
> >
> > totalpackets_in = strtoul(&buffer[15], NULL, 10);
> >
> > I am not sure if 'wmnet' could do this better (any suggestions?),
>
> *snort*
>
> well, yes - it's called scanf(). And if one is really, really nervous
> about the overhead of <gasp> parsing a bunch of integers (as if fopen/
> fgets/fclose alone won't cost enough to make constantly calling that
> sucker a bad idea), just use ptr + <something> - 6 instead of
> &buffer[<something>] in there. That thing has just found where the
> colon was (and replaced it with NUL), so dealing with "the first field
> turned out to be too long and shifted everything past it" isn't hard.
>
> > but the fact is that it was working before and now it is not.
>
> True. Mind you, the real issue is that this code expects the interface
> names to be never longer than 6 characters, but then /proc/net/dev layout
> strongly suggests that. Hell knows; it is a regression and it does
> break real-world userland code. The only way to avoid that, AFAICS, is
> to prohibit interface names longer than 6 chars ;-/
>
> Lovely combination of crappy ABI (procfs file layout), crappy userland
> code relying on details of said ABI out of sheer laziness and triggering
> kernel change producing bloody long interface names...
>
> Incidentally, sufficiently long interface name will produce other fun issues
> for a docked app - it simply won't fit into 64x64 square on screen ;-)
Mind you, assuming that columns will align is obviously broken - the producing
side of that thing is
seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "
"%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",
dev->name, stats->rx_bytes, stats->rx_packets,
stats->rx_errors,
stats->rx_dropped + stats->rx_missed_errors,
stats->rx_fifo_errors,
stats->rx_length_errors + stats->rx_over_errors +
stats->rx_crc_errors + stats->rx_frame_errors,
stats->rx_compressed, stats->multicast,
stats->tx_bytes, stats->tx_packets,
stats->tx_errors, stats->tx_dropped,
stats->tx_fifo_errors, stats->collisions,
stats->tx_carrier_errors +
stats->tx_aborted_errors +
stats->tx_window_errors +
stats->tx_heartbeat_errors,
stats->tx_compressed);
To start with, expecting the ->rx_bytes to remain a 7-digit number is somewhat,
er, odd. Long interace names be damned, the columns will not stay aligned,
no matter what. Unless your interface vanishes as soon as it has sent
or received 10 megabytes, that is...
^ permalink raw reply
* Re: /proc/net/dev regression
From: Carlos R. Mafra @ 2015-01-11 0:58 UTC (permalink / raw)
To: Al Viro; +Cc: LKML, Hauke Mehrtens, John W. Linville, netdev
In-Reply-To: <20150111002706.GC22149@ZenIV.linux.org.uk>
On Sun, 11 Jan 2015 at 0:27:06 +0000, Al Viro wrote:
> On Sat, Jan 10, 2015 at 11:25:18PM +0000, Carlos R. Mafra wrote:
> > [mafra@linux-g29b:wmnet]$ cat net_dev_bad.txt
> > Inter-| Receive | Transmit
> > face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
> > lo: 600 8 0 0 0 0 0 0 600 8 0 0 0 0 0 0
> > wlp3s0b1: 9266848 7298 0 0 0 0 0 0 372229 4030 0 0 0 0 0 0
> >
> > And for some reason this change confuses 'wmnet'. Reading the source code
> > of 'wmnet' I found that it reads the packets as follows,
> >
> > totalpackets_in = strtoul(&buffer[15], NULL, 10);
> >
> > I am not sure if 'wmnet' could do this better (any suggestions?),
>
> *snort*
>
> well, yes - it's called scanf(). And if one is really, really nervous
> about the overhead of <gasp> parsing a bunch of integers (as if fopen/
> fgets/fclose alone won't cost enough to make constantly calling that
> sucker a bad idea), just use ptr + <something> - 6 instead of
> &buffer[<something>] in there. That thing has just found where the
> colon was (and replaced it with NUL), so dealing with "the first field
> turned out to be too long and shifted everything past it" isn't hard.
Alright! Thank you.
> > but the fact is that it was working before and now it is not.
>
> True. Mind you, the real issue is that this code expects the interface
> names to be never longer than 6 characters, but then /proc/net/dev layout
> strongly suggests that. Hell knows; it is a regression and it does
> break real-world userland code. The only way to avoid that, AFAICS, is
> to prohibit interface names longer than 6 chars ;-/
>
> Lovely combination of crappy ABI (procfs file layout), crappy userland
> code relying on details of said ABI out of sheer laziness and triggering
> kernel change producing bloody long interface names...
I won't mind just changing the crappy and fragile wmnet code and moving on.
I have already lost the 2 hours bisecting this anyway.
Thank you very much for your advice.
^ permalink raw reply
* Re: /proc/net/dev regression
From: Al Viro @ 2015-01-11 0:27 UTC (permalink / raw)
To: Carlos R. Mafra; +Cc: LKML, Hauke Mehrtens, John W. Linville, netdev
In-Reply-To: <20150110232518.GA3212@linux-g29b.site>
On Sat, Jan 10, 2015 at 11:25:18PM +0000, Carlos R. Mafra wrote:
> [mafra@linux-g29b:wmnet]$ cat net_dev_bad.txt
> Inter-| Receive | Transmit
> face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
> lo: 600 8 0 0 0 0 0 0 600 8 0 0 0 0 0 0
> wlp3s0b1: 9266848 7298 0 0 0 0 0 0 372229 4030 0 0 0 0 0 0
>
> And for some reason this change confuses 'wmnet'. Reading the source code
> of 'wmnet' I found that it reads the packets as follows,
>
> totalpackets_in = strtoul(&buffer[15], NULL, 10);
>
> I am not sure if 'wmnet' could do this better (any suggestions?),
*snort*
well, yes - it's called scanf(). And if one is really, really nervous
about the overhead of <gasp> parsing a bunch of integers (as if fopen/
fgets/fclose alone won't cost enough to make constantly calling that
sucker a bad idea), just use ptr + <something> - 6 instead of
&buffer[<something>] in there. That thing has just found where the
colon was (and replaced it with NUL), so dealing with "the first field
turned out to be too long and shifted everything past it" isn't hard.
> but the fact is that it was working before and now it is not.
True. Mind you, the real issue is that this code expects the interface
names to be never longer than 6 characters, but then /proc/net/dev layout
strongly suggests that. Hell knows; it is a regression and it does
break real-world userland code. The only way to avoid that, AFAICS, is
to prohibit interface names longer than 6 chars ;-/
Lovely combination of crappy ABI (procfs file layout), crappy userland
code relying on details of said ABI out of sheer laziness and triggering
kernel change producing bloody long interface names...
Incidentally, sufficiently long interface name will produce other fun issues
for a docked app - it simply won't fit into 64x64 square on screen ;-)
^ permalink raw reply
* /proc/net/dev regression
From: Carlos R. Mafra @ 2015-01-10 23:25 UTC (permalink / raw)
To: LKML; +Cc: Hauke Mehrtens, John W. Linville, netdev
I use a dockapp called 'wmnet' [1] to monitor the speed of
my internet connection and after the kernel v3.18 it does no
longer work properly (it still doesn't work in v3.19-rc3)
I bisected the problem and the culprit is this commit:
commit 6e094bd805a9b6ad2f5421125db8f604a166616c
Author: Rafał Miłecki <zajec5@gmail.com>
Date: Fri Sep 5 00:18:48 2014 +0200
bcma: move code for core registration into separate function
This cleans code a bit and will us to register cores in other places as
well. The only difference with this patch is using "core_index" for
setting device name.
The problem is caused by the different name that my wireless connection
receives after this patch:
wlp3s0b1 (after the patch)
wlp3s0 (before the patch)
because it affects the display of information in the file /proc/net/dev.
Before the patch the fields are all aligned:
[mafra@linux-g29b:wmnet]$ cat net_dev_good.txt
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 35916 332 0 0 0 0 0 0 35916 332 0 0 0 0 0 0
wlp3s0: 6406428 5794 0 0 0 0 0 0 426813 3778 0 0 0 0 0 0
but after the patch the fields are misaligned:
[mafra@linux-g29b:wmnet]$ cat net_dev_bad.txt
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 600 8 0 0 0 0 0 0 600 8 0 0 0 0 0 0
wlp3s0b1: 9266848 7298 0 0 0 0 0 0 372229 4030 0 0 0 0 0 0
And for some reason this change confuses 'wmnet'. Reading the source code
of 'wmnet' I found that it reads the packets as follows,
totalpackets_in = strtoul(&buffer[15], NULL, 10);
I am not sure if 'wmnet' could do this better (any suggestions?),
but the fact is that it was working before and now it is not.
Any help is greatly appreciated.
[1] wmnet can be found in http://repo.or.cz/w/dockapps.git
^ permalink raw reply
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Oded Gabbay @ 2015-01-10 22:08 UTC (permalink / raw)
To: Eric Dumazet, Johannes Berg
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <54B1A22C.2020301@amd.com>
On 01/11/2015 12:05 AM, Oded Gabbay wrote:
>
>
> On 01/10/2015 11:50 PM, Eric Dumazet wrote:
>> On Sat, 2015-01-10 at 23:30 +0200, Oded Gabbay wrote:
>>
>>> Yes, no problem.
>>> I will update on the result.
>>
>> Please try this more complete patch, solving the TX pressure problem as
>> well, and not lying about NAPI budget. thanks !
>>
>>
>> diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
>> index e398eda07298..5f05b387c0a7 100644
>> --- a/drivers/net/ethernet/atheros/alx/main.c
>> +++ b/drivers/net/ethernet/atheros/alx/main.c
>> @@ -184,15 +184,16 @@ static void alx_schedule_reset(struct alx_priv *alx)
>> schedule_work(&alx->reset_wk);
>> }
>>
>> -static bool alx_clean_rx_irq(struct alx_priv *alx, int budget)
>> +static int alx_clean_rx_irq(struct alx_priv *alx, int budget)
>> {
>> struct alx_rx_queue *rxq = &alx->rxq;
>> struct alx_rrd *rrd;
>> struct alx_buffer *rxb;
>> struct sk_buff *skb;
>> u16 length, rfd_cleaned = 0;
>> + int work = 0;
>>
>> - while (budget > 0) {
>> + while (work < budget) {
>> rrd = &rxq->rrd[rxq->rrd_read_idx];
>> if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT)))
>> break;
>> @@ -243,7 +244,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget)
>> }
>>
>> napi_gro_receive(&alx->napi, skb);
>> - budget--;
>> + work++;
>>
>> next_pkt:
>> if (++rxq->read_idx == alx->rx_ringsz)
>> @@ -258,21 +259,22 @@ next_pkt:
>> if (rfd_cleaned)
>> alx_refill_rx_ring(alx, GFP_ATOMIC);
>>
>> - return budget > 0;
>> + return work;
>> }
>>
>> static int alx_poll(struct napi_struct *napi, int budget)
>> {
>> struct alx_priv *alx = container_of(napi, struct alx_priv, napi);
>> struct alx_hw *hw = &alx->hw;
>> - bool complete = true;
>> unsigned long flags;
>> + bool tx_complete;
>> + int work;
>>
>> - complete = alx_clean_tx_irq(alx) &&
>> - alx_clean_rx_irq(alx, budget);
>> + tx_complete = alx_clean_tx_irq(alx);
>> + work = alx_clean_rx_irq(alx, budget);
>>
>> - if (!complete)
>> - return 1;
>> + if (!tx_complete || work == budget)
>> + return budget;
>>
>> napi_complete(&alx->napi);
>>
>> @@ -284,7 +286,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
>>
>> alx_post_write(hw);
>>
>> - return 0;
>> + return work;
>> }
>>
>> static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr)
>>
>>
> Hi,
> Checked it and its working.
> Thanks again.
> Please note that I only use this Ethernet controller for NFS and SCP, it is
> not used for development of networking software of any kind, so maybe a more
> extensive testing is needed.
>
> Oded
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
But in any case, you can add:
Tested-by: Oded Gabbay <oded.gabbay@amd.com>
Oded
^ permalink raw reply
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Oded Gabbay @ 2015-01-10 22:05 UTC (permalink / raw)
To: Eric Dumazet, Johannes Berg
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <1420926614.5947.89.camel@edumazet-glaptop2.roam.corp.google.com>
On 01/10/2015 11:50 PM, Eric Dumazet wrote:
> On Sat, 2015-01-10 at 23:30 +0200, Oded Gabbay wrote:
>
>> Yes, no problem.
>> I will update on the result.
>
> Please try this more complete patch, solving the TX pressure problem as
> well, and not lying about NAPI budget. thanks !
>
>
> diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
> index e398eda07298..5f05b387c0a7 100644
> --- a/drivers/net/ethernet/atheros/alx/main.c
> +++ b/drivers/net/ethernet/atheros/alx/main.c
> @@ -184,15 +184,16 @@ static void alx_schedule_reset(struct alx_priv *alx)
> schedule_work(&alx->reset_wk);
> }
>
> -static bool alx_clean_rx_irq(struct alx_priv *alx, int budget)
> +static int alx_clean_rx_irq(struct alx_priv *alx, int budget)
> {
> struct alx_rx_queue *rxq = &alx->rxq;
> struct alx_rrd *rrd;
> struct alx_buffer *rxb;
> struct sk_buff *skb;
> u16 length, rfd_cleaned = 0;
> + int work = 0;
>
> - while (budget > 0) {
> + while (work < budget) {
> rrd = &rxq->rrd[rxq->rrd_read_idx];
> if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT)))
> break;
> @@ -243,7 +244,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget)
> }
>
> napi_gro_receive(&alx->napi, skb);
> - budget--;
> + work++;
>
> next_pkt:
> if (++rxq->read_idx == alx->rx_ringsz)
> @@ -258,21 +259,22 @@ next_pkt:
> if (rfd_cleaned)
> alx_refill_rx_ring(alx, GFP_ATOMIC);
>
> - return budget > 0;
> + return work;
> }
>
> static int alx_poll(struct napi_struct *napi, int budget)
> {
> struct alx_priv *alx = container_of(napi, struct alx_priv, napi);
> struct alx_hw *hw = &alx->hw;
> - bool complete = true;
> unsigned long flags;
> + bool tx_complete;
> + int work;
>
> - complete = alx_clean_tx_irq(alx) &&
> - alx_clean_rx_irq(alx, budget);
> + tx_complete = alx_clean_tx_irq(alx);
> + work = alx_clean_rx_irq(alx, budget);
>
> - if (!complete)
> - return 1;
> + if (!tx_complete || work == budget)
> + return budget;
>
> napi_complete(&alx->napi);
>
> @@ -284,7 +286,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
>
> alx_post_write(hw);
>
> - return 0;
> + return work;
> }
>
> static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr)
>
>
Hi,
Checked it and its working.
Thanks again.
Please note that I only use this Ethernet controller for NFS and SCP, it is
not used for development of networking software of any kind, so maybe a more
extensive testing is needed.
Oded
^ permalink raw reply
* Re: Re: [PATCH] net: less interrupt masking in NAPI
From: Oded Gabbay @ 2015-01-10 20:27 UTC (permalink / raw)
To: davem, eric.dumazet; +Cc: netdev, willemb
In-Reply-To: <20141103.122538.387451917276174830.davem@davemloft.net>
On 2014/11/4 1:25, David Miller wrote:
> From: Eric Dumazet <eric.dumazet@xxxxxxxxx>
> Date: Sun, 02 Nov 2014 06:19:33 -0800
>
>> From: Eric Dumazet <edumazet@xxxxxxxxxx>
>>
>> net_rx_action() can mask irqs a single time to transfert sd->poll_list
>> into a private list, for a very short duration.
>>
>> Then, napi_complete() can avoid masking irqs again,
>> and net_rx_action() only needs to mask irq again in slow path.
>>
>> This patch removes 2 couples of irq mask/unmask per typical NAPI run,
>> more if multiple napi were triggered.
>>
>> Note this also allows to give control back to caller (do_softirq())
>> more often, so that other softirq handlers can be called a bit earlier,
>> or ksoftirqd can be wakeup earlier under pressure.
>>
>> This was developed while testing an alternative to RX interrupt
>> mitigation to reduce latencies while keeping or improving GRO
>> aggregation on fast NIC.
>>
>> Idea is to test napi->gro_list at the end of a napi->poll() and
>> reschedule one NAPI poll, but after servicing a full round of
>> softirqs (timers, TX, rcu, ...). This will be allowed only if softirq
>> is currently serviced by idle task or ksoftirqd, and resched not needed.
>>
>> Signed-off-by: Eric Dumazet <edumazet@xxxxxxxxxx>
>
> Also applied, thanks Eric.
Hi,
Unfortunately, this patch breaks my "Qualcomm Atheros AR8161 Gigabit
Ethernet (rev 10)" Ethernet controller, which is handled by the alx
network driver.
ogabbay@odedg-ubuntu:~$ lspci -s 01:00.0 -k
01:00.0 Ethernet controller:
Qualcomm Atheros AR8161 Gigabit Ethernet (rev 10)
Subsystem: Qualcomm Atheros Device 1071
Kernel driver in use: alx
I have this controller on a mobile platform which I use to test amdkfd
on Kaveri AMD APU and from 3.19-rc1, the network stopped working when
trying to transfer files through scp or nfs.
I bisected the kernel (from 3.18.0 to 3.19-rc1) and reached this patch.
Here is the log of the bisect:
git bisect start
# bad: [97bf6af1f928216fd6c5a66e8a57bfa95a659672] Linux 3.19-rc1
git bisect bad 97bf6af1f928216fd6c5a66e8a57bfa95a659672
# good: [b2776bf7149bddd1f4161f14f79520f17fc1d71d] Linux 3.18
git bisect good b2776bf7149bddd1f4161f14f79520f17fc1d71d
# bad: [70e71ca0af244f48a5dcf56dc435243792e3a495] Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
git bisect bad 70e71ca0af244f48a5dcf56dc435243792e3a495
# good: [e28870f9b3e92cd3570925089c6bb789c2603bc4] Merge tag 'backlight-for-linus-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
git bisect good e28870f9b3e92cd3570925089c6bb789c2603bc4
# bad: [450fa21942fe2c37f0c9f52d1a33bbc081eee288] sh_eth: Remove redundant alignment adjustment
git bisect bad 450fa21942fe2c37f0c9f52d1a33bbc081eee288
# bad: [5c8d19da950861d0482abc0ac3481acca34b008f] e100e: use netdev_rss_key_fill() helper
git bisect bad 5c8d19da950861d0482abc0ac3481acca34b008f
# good: [bf515fb11ab539c76d04f0e3c5216ed41f41d81f] Merge tag 'mac80211-next-for-john-2014-11-04' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
git bisect good bf515fb11ab539c76d04f0e3c5216ed41f41d81f
# bad: [2c99cd914d4fed9160d98849c9dd38034616768e] Merge branch 'amd-xgbe-next'
git bisect bad 2c99cd914d4fed9160d98849c9dd38034616768e
# good: [3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2] net: dsa: Add support for reading switch registers with ethtool
git bisect good 3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2
# bad: [8ce0c8254f15229aa99fc6c04141f28c446e5f8c] Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
git bisect bad 8ce0c8254f15229aa99fc6c04141f28c446e5f8c
# good: [f0c65567b3c1b23f79e8a49139580a3872a68d1f] Merge branch 'sunvnet-multi-tx-queue'
git bisect good f0c65567b3c1b23f79e8a49139580a3872a68d1f
# bad: [547f2735c20023d7b50a791b1b17cacb652e9237] Merge branch 'mlx4-next'
git bisect bad 547f2735c20023d7b50a791b1b17cacb652e9237
# good: [4cdb1e2e3d3495423db558d3bb7ed11d66aabce7] net: shrink struct softnet_data
git bisect good 4cdb1e2e3d3495423db558d3bb7ed11d66aabce7
# bad: [0a98455666ec87378148a1dde97f1ce5baf75a64] net/mlx4_core: Protect port type setting by mutex
git bisect bad 0a98455666ec87378148a1dde97f1ce5baf75a64
# bad: [6e8066999800d90d52af5c84ac49ebf683d14cdc] net/mlx4_core: Prevent VF from changing port configuration
git bisect bad 6e8066999800d90d52af5c84ac49ebf683d14cdc
# bad: [d75b1ade567ffab085e8adbbdacf0092d10cd09c] net: less interrupt masking in NAPI
git bisect bad d75b1ade567ffab085e8adbbdacf0092d10cd09c
# first bad commit: [d75b1ade567ffab085e8adbbdacf0092d10cd09c]
net: less interrupt masking in NAPI
Could you please solve this issue as it renders my board quite useless.
If you need more info, please ask.
Thanks,
Oded
^ permalink raw reply
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Eric Dumazet @ 2015-01-10 21:50 UTC (permalink / raw)
To: Oded Gabbay, Johannes Berg
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <54B199EB.1080004@amd.com>
On Sat, 2015-01-10 at 23:30 +0200, Oded Gabbay wrote:
> Yes, no problem.
> I will update on the result.
Please try this more complete patch, solving the TX pressure problem as
well, and not lying about NAPI budget. thanks !
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
index e398eda07298..5f05b387c0a7 100644
--- a/drivers/net/ethernet/atheros/alx/main.c
+++ b/drivers/net/ethernet/atheros/alx/main.c
@@ -184,15 +184,16 @@ static void alx_schedule_reset(struct alx_priv *alx)
schedule_work(&alx->reset_wk);
}
-static bool alx_clean_rx_irq(struct alx_priv *alx, int budget)
+static int alx_clean_rx_irq(struct alx_priv *alx, int budget)
{
struct alx_rx_queue *rxq = &alx->rxq;
struct alx_rrd *rrd;
struct alx_buffer *rxb;
struct sk_buff *skb;
u16 length, rfd_cleaned = 0;
+ int work = 0;
- while (budget > 0) {
+ while (work < budget) {
rrd = &rxq->rrd[rxq->rrd_read_idx];
if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT)))
break;
@@ -243,7 +244,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget)
}
napi_gro_receive(&alx->napi, skb);
- budget--;
+ work++;
next_pkt:
if (++rxq->read_idx == alx->rx_ringsz)
@@ -258,21 +259,22 @@ next_pkt:
if (rfd_cleaned)
alx_refill_rx_ring(alx, GFP_ATOMIC);
- return budget > 0;
+ return work;
}
static int alx_poll(struct napi_struct *napi, int budget)
{
struct alx_priv *alx = container_of(napi, struct alx_priv, napi);
struct alx_hw *hw = &alx->hw;
- bool complete = true;
unsigned long flags;
+ bool tx_complete;
+ int work;
- complete = alx_clean_tx_irq(alx) &&
- alx_clean_rx_irq(alx, budget);
+ tx_complete = alx_clean_tx_irq(alx);
+ work = alx_clean_rx_irq(alx, budget);
- if (!complete)
- return 1;
+ if (!tx_complete || work == budget)
+ return budget;
napi_complete(&alx->napi);
@@ -284,7 +286,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
alx_post_write(hw);
- return 0;
+ return work;
}
static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr)
^ permalink raw reply related
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Oded Gabbay @ 2015-01-10 21:43 UTC (permalink / raw)
To: Eric Dumazet
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <54B199EB.1080004@amd.com>
On 01/10/2015 11:30 PM, Oded Gabbay wrote:
>
>
> On 01/10/2015 10:58 PM, Eric Dumazet wrote:
>> On Sat, 2015-01-10 at 22:39 +0200, Oded Gabbay wrote:
>>> Hi,
>>>
>>> Commit d75b1ade567ffab085e8adbbdacf0092d10cd09c breaks my "Qualcomm Atheros
>>> AR8161 Gigabit Ethernet (rev 10)" Ethernet controller, which is handled by
>>> the alx network driver.
>>>
>>> ogabbay@odedg-ubuntu:~$ lspci -s 01:00.0 -k
>>> 01:00.0 Ethernet controller:
>>> Qualcomm Atheros AR8161 Gigabit Ethernet (rev 10)
>>> Subsystem: Qualcomm Atheros Device 1071
>>> Kernel driver in use: alx
>>>
>>> I have this controller on a mobile platform of AMD APU Kaveri, which I use
>>> to test amdkfd, and from 3.19-rc1 the network stopped working when trying to
>>> transfer files through scp or nfs.
>>>
>>> I bisected the kernel (from 3.18.0 to 3.19-rc1) and reached this commit.
>>>
>>> Here is the log of the bisect:
>>>
>>> git bisect start
>>> # bad: [97bf6af1f928216fd6c5a66e8a57bfa95a659672] Linux 3.19-rc1
>>> git bisect bad 97bf6af1f928216fd6c5a66e8a57bfa95a659672
>>>
>>> # good: [b2776bf7149bddd1f4161f14f79520f17fc1d71d] Linux 3.18
>>> git bisect good b2776bf7149bddd1f4161f14f79520f17fc1d71d
>>>
>>> # bad: [70e71ca0af244f48a5dcf56dc435243792e3a495] Merge
>>> git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
>>> git bisect bad 70e71ca0af244f48a5dcf56dc435243792e3a495
>>>
>>> # good: [e28870f9b3e92cd3570925089c6bb789c2603bc4] Merge tag
>>> 'backlight-for-linus-3.19' of
>>> git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
>>> git bisect good e28870f9b3e92cd3570925089c6bb789c2603bc4
>>>
>>> # bad: [450fa21942fe2c37f0c9f52d1a33bbc081eee288] sh_eth: Remove redundant
>>> alignment adjustment
>>> git bisect bad 450fa21942fe2c37f0c9f52d1a33bbc081eee288
>>>
>>> # bad: [5c8d19da950861d0482abc0ac3481acca34b008f] e100e: use
>>> netdev_rss_key_fill() helper
>>> git bisect bad 5c8d19da950861d0482abc0ac3481acca34b008f
>>>
>>> # good: [bf515fb11ab539c76d04f0e3c5216ed41f41d81f] Merge tag
>>> 'mac80211-next-for-john-2014-11-04' of
>>> git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
>>> git bisect good bf515fb11ab539c76d04f0e3c5216ed41f41d81f
>>>
>>> # bad: [2c99cd914d4fed9160d98849c9dd38034616768e] Merge branch 'amd-xgbe-next'
>>> git bisect bad 2c99cd914d4fed9160d98849c9dd38034616768e
>>>
>>> # good: [3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2] net: dsa: Add support for
>>> reading switch registers with ethtool
>>> git bisect good 3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2
>>>
>>> # bad: [8ce0c8254f15229aa99fc6c04141f28c446e5f8c] Merge branch 'master' of
>>> git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
>>> git bisect bad 8ce0c8254f15229aa99fc6c04141f28c446e5f8c
>>>
>>> # good: [f0c65567b3c1b23f79e8a49139580a3872a68d1f] Merge branch
>>> 'sunvnet-multi-tx-queue'
>>> git bisect good f0c65567b3c1b23f79e8a49139580a3872a68d1f
>>>
>>> # bad: [547f2735c20023d7b50a791b1b17cacb652e9237] Merge branch 'mlx4-next'
>>> git bisect bad 547f2735c20023d7b50a791b1b17cacb652e9237
>>>
>>> # good: [4cdb1e2e3d3495423db558d3bb7ed11d66aabce7] net: shrink struct
>>> softnet_data
>>> git bisect good 4cdb1e2e3d3495423db558d3bb7ed11d66aabce7
>>>
>>> # bad: [0a98455666ec87378148a1dde97f1ce5baf75a64] net/mlx4_core: Protect
>>> port type setting by mutex
>>> git bisect bad 0a98455666ec87378148a1dde97f1ce5baf75a64
>>>
>>> # bad: [6e8066999800d90d52af5c84ac49ebf683d14cdc] net/mlx4_core: Prevent VF
>>> from changing port configuration
>>> git bisect bad 6e8066999800d90d52af5c84ac49ebf683d14cdc
>>>
>>> # bad: [d75b1ade567ffab085e8adbbdacf0092d10cd09c] net: less interrupt
>>> masking in NAPI
>>> git bisect bad d75b1ade567ffab085e8adbbdacf0092d10cd09c
>>>
>>> # first bad commit: [d75b1ade567ffab085e8adbbdacf0092d10cd09c]
>>> net: less interrupt masking in NAPI
>>>
>>> Could you please solve this issue as it renders my board quite useless.
>>>
>>
>> Thanks for the report and bisection !
>>
>> Could you try following fix ?
>>
>> diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
>> index e398eda07298..209c40765e0d 100644
>> --- a/drivers/net/ethernet/atheros/alx/main.c
>> +++ b/drivers/net/ethernet/atheros/alx/main.c
>> @@ -272,7 +272,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
>> alx_clean_rx_irq(alx, budget);
>>
>> if (!complete)
>> - return 1;
>> + return budget;
>>
>> napi_complete(&alx->napi);
>>
>>
>>
>>
>>
> Yes, no problem.
> I will update on the result.
>
> Oded
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
Hi Eric,
Your patch fixed the problem.
Thanks for the quick help!
Oded
^ permalink raw reply
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Oded Gabbay @ 2015-01-10 21:30 UTC (permalink / raw)
To: Eric Dumazet
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <1420923485.5947.85.camel@edumazet-glaptop2.roam.corp.google.com>
On 01/10/2015 10:58 PM, Eric Dumazet wrote:
> On Sat, 2015-01-10 at 22:39 +0200, Oded Gabbay wrote:
>> Hi,
>>
>> Commit d75b1ade567ffab085e8adbbdacf0092d10cd09c breaks my "Qualcomm Atheros
>> AR8161 Gigabit Ethernet (rev 10)" Ethernet controller, which is handled by
>> the alx network driver.
>>
>> ogabbay@odedg-ubuntu:~$ lspci -s 01:00.0 -k
>> 01:00.0 Ethernet controller:
>> Qualcomm Atheros AR8161 Gigabit Ethernet (rev 10)
>> Subsystem: Qualcomm Atheros Device 1071
>> Kernel driver in use: alx
>>
>> I have this controller on a mobile platform of AMD APU Kaveri, which I use
>> to test amdkfd, and from 3.19-rc1 the network stopped working when trying to
>> transfer files through scp or nfs.
>>
>> I bisected the kernel (from 3.18.0 to 3.19-rc1) and reached this commit.
>>
>> Here is the log of the bisect:
>>
>> git bisect start
>> # bad: [97bf6af1f928216fd6c5a66e8a57bfa95a659672] Linux 3.19-rc1
>> git bisect bad 97bf6af1f928216fd6c5a66e8a57bfa95a659672
>>
>> # good: [b2776bf7149bddd1f4161f14f79520f17fc1d71d] Linux 3.18
>> git bisect good b2776bf7149bddd1f4161f14f79520f17fc1d71d
>>
>> # bad: [70e71ca0af244f48a5dcf56dc435243792e3a495] Merge
>> git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
>> git bisect bad 70e71ca0af244f48a5dcf56dc435243792e3a495
>>
>> # good: [e28870f9b3e92cd3570925089c6bb789c2603bc4] Merge tag
>> 'backlight-for-linus-3.19' of
>> git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
>> git bisect good e28870f9b3e92cd3570925089c6bb789c2603bc4
>>
>> # bad: [450fa21942fe2c37f0c9f52d1a33bbc081eee288] sh_eth: Remove redundant
>> alignment adjustment
>> git bisect bad 450fa21942fe2c37f0c9f52d1a33bbc081eee288
>>
>> # bad: [5c8d19da950861d0482abc0ac3481acca34b008f] e100e: use
>> netdev_rss_key_fill() helper
>> git bisect bad 5c8d19da950861d0482abc0ac3481acca34b008f
>>
>> # good: [bf515fb11ab539c76d04f0e3c5216ed41f41d81f] Merge tag
>> 'mac80211-next-for-john-2014-11-04' of
>> git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
>> git bisect good bf515fb11ab539c76d04f0e3c5216ed41f41d81f
>>
>> # bad: [2c99cd914d4fed9160d98849c9dd38034616768e] Merge branch 'amd-xgbe-next'
>> git bisect bad 2c99cd914d4fed9160d98849c9dd38034616768e
>>
>> # good: [3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2] net: dsa: Add support for
>> reading switch registers with ethtool
>> git bisect good 3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2
>>
>> # bad: [8ce0c8254f15229aa99fc6c04141f28c446e5f8c] Merge branch 'master' of
>> git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
>> git bisect bad 8ce0c8254f15229aa99fc6c04141f28c446e5f8c
>>
>> # good: [f0c65567b3c1b23f79e8a49139580a3872a68d1f] Merge branch
>> 'sunvnet-multi-tx-queue'
>> git bisect good f0c65567b3c1b23f79e8a49139580a3872a68d1f
>>
>> # bad: [547f2735c20023d7b50a791b1b17cacb652e9237] Merge branch 'mlx4-next'
>> git bisect bad 547f2735c20023d7b50a791b1b17cacb652e9237
>>
>> # good: [4cdb1e2e3d3495423db558d3bb7ed11d66aabce7] net: shrink struct
>> softnet_data
>> git bisect good 4cdb1e2e3d3495423db558d3bb7ed11d66aabce7
>>
>> # bad: [0a98455666ec87378148a1dde97f1ce5baf75a64] net/mlx4_core: Protect
>> port type setting by mutex
>> git bisect bad 0a98455666ec87378148a1dde97f1ce5baf75a64
>>
>> # bad: [6e8066999800d90d52af5c84ac49ebf683d14cdc] net/mlx4_core: Prevent VF
>> from changing port configuration
>> git bisect bad 6e8066999800d90d52af5c84ac49ebf683d14cdc
>>
>> # bad: [d75b1ade567ffab085e8adbbdacf0092d10cd09c] net: less interrupt
>> masking in NAPI
>> git bisect bad d75b1ade567ffab085e8adbbdacf0092d10cd09c
>>
>> # first bad commit: [d75b1ade567ffab085e8adbbdacf0092d10cd09c]
>> net: less interrupt masking in NAPI
>>
>> Could you please solve this issue as it renders my board quite useless.
>>
>
> Thanks for the report and bisection !
>
> Could you try following fix ?
>
> diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
> index e398eda07298..209c40765e0d 100644
> --- a/drivers/net/ethernet/atheros/alx/main.c
> +++ b/drivers/net/ethernet/atheros/alx/main.c
> @@ -272,7 +272,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
> alx_clean_rx_irq(alx, budget);
>
> if (!complete)
> - return 1;
> + return budget;
>
> napi_complete(&alx->napi);
>
>
>
>
>
Yes, no problem.
I will update on the result.
Oded
^ permalink raw reply
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Eric Dumazet @ 2015-01-10 21:10 UTC (permalink / raw)
To: Oded Gabbay, Johannes Berg
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <1420923485.5947.85.camel@edumazet-glaptop2.roam.corp.google.com>
On Sat, 2015-01-10 at 12:58 -0800, Eric Dumazet wrote:
> On Sat, 2015-01-10 at 22:39 +0200, Oded Gabbay wrote:
> > Hi,
> >
> > Commit d75b1ade567ffab085e8adbbdacf0092d10cd09c breaks my "Qualcomm Atheros
> > AR8161 Gigabit Ethernet (rev 10)" Ethernet controller, which is handled by
> > the alx network driver.
> >
> > ogabbay@odedg-ubuntu:~$ lspci -s 01:00.0 -k
> > 01:00.0 Ethernet controller:
> > Qualcomm Atheros AR8161 Gigabit Ethernet (rev 10)
> > Subsystem: Qualcomm Atheros Device 1071
> > Kernel driver in use: alx
> >
> > I have this controller on a mobile platform of AMD APU Kaveri, which I use
> > to test amdkfd, and from 3.19-rc1 the network stopped working when trying to
> > transfer files through scp or nfs.
> >
> > I bisected the kernel (from 3.18.0 to 3.19-rc1) and reached this commit.
> >
> > Here is the log of the bisect:
> >
> > git bisect start
> > # bad: [97bf6af1f928216fd6c5a66e8a57bfa95a659672] Linux 3.19-rc1
> > git bisect bad 97bf6af1f928216fd6c5a66e8a57bfa95a659672
> >
> > # good: [b2776bf7149bddd1f4161f14f79520f17fc1d71d] Linux 3.18
> > git bisect good b2776bf7149bddd1f4161f14f79520f17fc1d71d
> >
> > # bad: [70e71ca0af244f48a5dcf56dc435243792e3a495] Merge
> > git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
> > git bisect bad 70e71ca0af244f48a5dcf56dc435243792e3a495
> >
> > # good: [e28870f9b3e92cd3570925089c6bb789c2603bc4] Merge tag
> > 'backlight-for-linus-3.19' of
> > git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
> > git bisect good e28870f9b3e92cd3570925089c6bb789c2603bc4
> >
> > # bad: [450fa21942fe2c37f0c9f52d1a33bbc081eee288] sh_eth: Remove redundant
> > alignment adjustment
> > git bisect bad 450fa21942fe2c37f0c9f52d1a33bbc081eee288
> >
> > # bad: [5c8d19da950861d0482abc0ac3481acca34b008f] e100e: use
> > netdev_rss_key_fill() helper
> > git bisect bad 5c8d19da950861d0482abc0ac3481acca34b008f
> >
> > # good: [bf515fb11ab539c76d04f0e3c5216ed41f41d81f] Merge tag
> > 'mac80211-next-for-john-2014-11-04' of
> > git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
> > git bisect good bf515fb11ab539c76d04f0e3c5216ed41f41d81f
> >
> > # bad: [2c99cd914d4fed9160d98849c9dd38034616768e] Merge branch 'amd-xgbe-next'
> > git bisect bad 2c99cd914d4fed9160d98849c9dd38034616768e
> >
> > # good: [3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2] net: dsa: Add support for
> > reading switch registers with ethtool
> > git bisect good 3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2
> >
> > # bad: [8ce0c8254f15229aa99fc6c04141f28c446e5f8c] Merge branch 'master' of
> > git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
> > git bisect bad 8ce0c8254f15229aa99fc6c04141f28c446e5f8c
> >
> > # good: [f0c65567b3c1b23f79e8a49139580a3872a68d1f] Merge branch
> > 'sunvnet-multi-tx-queue'
> > git bisect good f0c65567b3c1b23f79e8a49139580a3872a68d1f
> >
> > # bad: [547f2735c20023d7b50a791b1b17cacb652e9237] Merge branch 'mlx4-next'
> > git bisect bad 547f2735c20023d7b50a791b1b17cacb652e9237
> >
> > # good: [4cdb1e2e3d3495423db558d3bb7ed11d66aabce7] net: shrink struct
> > softnet_data
> > git bisect good 4cdb1e2e3d3495423db558d3bb7ed11d66aabce7
> >
> > # bad: [0a98455666ec87378148a1dde97f1ce5baf75a64] net/mlx4_core: Protect
> > port type setting by mutex
> > git bisect bad 0a98455666ec87378148a1dde97f1ce5baf75a64
> >
> > # bad: [6e8066999800d90d52af5c84ac49ebf683d14cdc] net/mlx4_core: Prevent VF
> > from changing port configuration
> > git bisect bad 6e8066999800d90d52af5c84ac49ebf683d14cdc
> >
> > # bad: [d75b1ade567ffab085e8adbbdacf0092d10cd09c] net: less interrupt
> > masking in NAPI
> > git bisect bad d75b1ade567ffab085e8adbbdacf0092d10cd09c
> >
> > # first bad commit: [d75b1ade567ffab085e8adbbdacf0092d10cd09c]
> > net: less interrupt masking in NAPI
> >
> > Could you please solve this issue as it renders my board quite useless.
> >
>
> Thanks for the report and bisection !
>
> Could you try following fix ?
>
> diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
> index e398eda07298..209c40765e0d 100644
> --- a/drivers/net/ethernet/atheros/alx/main.c
> +++ b/drivers/net/ethernet/atheros/alx/main.c
> @@ -272,7 +272,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
> alx_clean_rx_irq(alx, budget);
>
> if (!complete)
> - return 1;
> + return budget;
>
> napi_complete(&alx->napi);
>
>
>
>
BTW this driver has other issues :
complete = alx_clean_tx_irq(alx) &&
alx_clean_rx_irq(alx, budget);
Means that under TX completion pressure (alx_clean_tx_irq(alx) return
false), we never dequeue packets from RX rings.
^ permalink raw reply
* Re: [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Eric Dumazet @ 2015-01-10 20:58 UTC (permalink / raw)
To: Oded Gabbay
Cc: David S. Miller, Eric Dumazet, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Willem de Bruijn, Bridgman, John,
Elifaz, Dana
In-Reply-To: <54B18DFF.80400@amd.com>
On Sat, 2015-01-10 at 22:39 +0200, Oded Gabbay wrote:
> Hi,
>
> Commit d75b1ade567ffab085e8adbbdacf0092d10cd09c breaks my "Qualcomm Atheros
> AR8161 Gigabit Ethernet (rev 10)" Ethernet controller, which is handled by
> the alx network driver.
>
> ogabbay@odedg-ubuntu:~$ lspci -s 01:00.0 -k
> 01:00.0 Ethernet controller:
> Qualcomm Atheros AR8161 Gigabit Ethernet (rev 10)
> Subsystem: Qualcomm Atheros Device 1071
> Kernel driver in use: alx
>
> I have this controller on a mobile platform of AMD APU Kaveri, which I use
> to test amdkfd, and from 3.19-rc1 the network stopped working when trying to
> transfer files through scp or nfs.
>
> I bisected the kernel (from 3.18.0 to 3.19-rc1) and reached this commit.
>
> Here is the log of the bisect:
>
> git bisect start
> # bad: [97bf6af1f928216fd6c5a66e8a57bfa95a659672] Linux 3.19-rc1
> git bisect bad 97bf6af1f928216fd6c5a66e8a57bfa95a659672
>
> # good: [b2776bf7149bddd1f4161f14f79520f17fc1d71d] Linux 3.18
> git bisect good b2776bf7149bddd1f4161f14f79520f17fc1d71d
>
> # bad: [70e71ca0af244f48a5dcf56dc435243792e3a495] Merge
> git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
> git bisect bad 70e71ca0af244f48a5dcf56dc435243792e3a495
>
> # good: [e28870f9b3e92cd3570925089c6bb789c2603bc4] Merge tag
> 'backlight-for-linus-3.19' of
> git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
> git bisect good e28870f9b3e92cd3570925089c6bb789c2603bc4
>
> # bad: [450fa21942fe2c37f0c9f52d1a33bbc081eee288] sh_eth: Remove redundant
> alignment adjustment
> git bisect bad 450fa21942fe2c37f0c9f52d1a33bbc081eee288
>
> # bad: [5c8d19da950861d0482abc0ac3481acca34b008f] e100e: use
> netdev_rss_key_fill() helper
> git bisect bad 5c8d19da950861d0482abc0ac3481acca34b008f
>
> # good: [bf515fb11ab539c76d04f0e3c5216ed41f41d81f] Merge tag
> 'mac80211-next-for-john-2014-11-04' of
> git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
> git bisect good bf515fb11ab539c76d04f0e3c5216ed41f41d81f
>
> # bad: [2c99cd914d4fed9160d98849c9dd38034616768e] Merge branch 'amd-xgbe-next'
> git bisect bad 2c99cd914d4fed9160d98849c9dd38034616768e
>
> # good: [3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2] net: dsa: Add support for
> reading switch registers with ethtool
> git bisect good 3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2
>
> # bad: [8ce0c8254f15229aa99fc6c04141f28c446e5f8c] Merge branch 'master' of
> git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
> git bisect bad 8ce0c8254f15229aa99fc6c04141f28c446e5f8c
>
> # good: [f0c65567b3c1b23f79e8a49139580a3872a68d1f] Merge branch
> 'sunvnet-multi-tx-queue'
> git bisect good f0c65567b3c1b23f79e8a49139580a3872a68d1f
>
> # bad: [547f2735c20023d7b50a791b1b17cacb652e9237] Merge branch 'mlx4-next'
> git bisect bad 547f2735c20023d7b50a791b1b17cacb652e9237
>
> # good: [4cdb1e2e3d3495423db558d3bb7ed11d66aabce7] net: shrink struct
> softnet_data
> git bisect good 4cdb1e2e3d3495423db558d3bb7ed11d66aabce7
>
> # bad: [0a98455666ec87378148a1dde97f1ce5baf75a64] net/mlx4_core: Protect
> port type setting by mutex
> git bisect bad 0a98455666ec87378148a1dde97f1ce5baf75a64
>
> # bad: [6e8066999800d90d52af5c84ac49ebf683d14cdc] net/mlx4_core: Prevent VF
> from changing port configuration
> git bisect bad 6e8066999800d90d52af5c84ac49ebf683d14cdc
>
> # bad: [d75b1ade567ffab085e8adbbdacf0092d10cd09c] net: less interrupt
> masking in NAPI
> git bisect bad d75b1ade567ffab085e8adbbdacf0092d10cd09c
>
> # first bad commit: [d75b1ade567ffab085e8adbbdacf0092d10cd09c]
> net: less interrupt masking in NAPI
>
> Could you please solve this issue as it renders my board quite useless.
>
Thanks for the report and bisection !
Could you try following fix ?
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
index e398eda07298..209c40765e0d 100644
--- a/drivers/net/ethernet/atheros/alx/main.c
+++ b/drivers/net/ethernet/atheros/alx/main.c
@@ -272,7 +272,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
alx_clean_rx_irq(alx, budget);
if (!complete)
- return 1;
+ return budget;
napi_complete(&alx->napi);
^ permalink raw reply related
* [BUG] 3.19-rc1 net: less interrupt masking in NAPI
From: Oded Gabbay @ 2015-01-10 20:39 UTC (permalink / raw)
To: David S. Miller, Eric Dumazet
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
Willem de Bruijn, Bridgman, John, Elifaz, Dana
Hi,
Commit d75b1ade567ffab085e8adbbdacf0092d10cd09c breaks my "Qualcomm Atheros
AR8161 Gigabit Ethernet (rev 10)" Ethernet controller, which is handled by
the alx network driver.
ogabbay@odedg-ubuntu:~$ lspci -s 01:00.0 -k
01:00.0 Ethernet controller:
Qualcomm Atheros AR8161 Gigabit Ethernet (rev 10)
Subsystem: Qualcomm Atheros Device 1071
Kernel driver in use: alx
I have this controller on a mobile platform of AMD APU Kaveri, which I use
to test amdkfd, and from 3.19-rc1 the network stopped working when trying to
transfer files through scp or nfs.
I bisected the kernel (from 3.18.0 to 3.19-rc1) and reached this commit.
Here is the log of the bisect:
git bisect start
# bad: [97bf6af1f928216fd6c5a66e8a57bfa95a659672] Linux 3.19-rc1
git bisect bad 97bf6af1f928216fd6c5a66e8a57bfa95a659672
# good: [b2776bf7149bddd1f4161f14f79520f17fc1d71d] Linux 3.18
git bisect good b2776bf7149bddd1f4161f14f79520f17fc1d71d
# bad: [70e71ca0af244f48a5dcf56dc435243792e3a495] Merge
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
git bisect bad 70e71ca0af244f48a5dcf56dc435243792e3a495
# good: [e28870f9b3e92cd3570925089c6bb789c2603bc4] Merge tag
'backlight-for-linus-3.19' of
git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight
git bisect good e28870f9b3e92cd3570925089c6bb789c2603bc4
# bad: [450fa21942fe2c37f0c9f52d1a33bbc081eee288] sh_eth: Remove redundant
alignment adjustment
git bisect bad 450fa21942fe2c37f0c9f52d1a33bbc081eee288
# bad: [5c8d19da950861d0482abc0ac3481acca34b008f] e100e: use
netdev_rss_key_fill() helper
git bisect bad 5c8d19da950861d0482abc0ac3481acca34b008f
# good: [bf515fb11ab539c76d04f0e3c5216ed41f41d81f] Merge tag
'mac80211-next-for-john-2014-11-04' of
git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
git bisect good bf515fb11ab539c76d04f0e3c5216ed41f41d81f
# bad: [2c99cd914d4fed9160d98849c9dd38034616768e] Merge branch 'amd-xgbe-next'
git bisect bad 2c99cd914d4fed9160d98849c9dd38034616768e
# good: [3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2] net: dsa: Add support for
reading switch registers with ethtool
git bisect good 3d762a0f0ab9cb4a6b5993db3ce56c92f9f90ab2
# bad: [8ce0c8254f15229aa99fc6c04141f28c446e5f8c] Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
git bisect bad 8ce0c8254f15229aa99fc6c04141f28c446e5f8c
# good: [f0c65567b3c1b23f79e8a49139580a3872a68d1f] Merge branch
'sunvnet-multi-tx-queue'
git bisect good f0c65567b3c1b23f79e8a49139580a3872a68d1f
# bad: [547f2735c20023d7b50a791b1b17cacb652e9237] Merge branch 'mlx4-next'
git bisect bad 547f2735c20023d7b50a791b1b17cacb652e9237
# good: [4cdb1e2e3d3495423db558d3bb7ed11d66aabce7] net: shrink struct
softnet_data
git bisect good 4cdb1e2e3d3495423db558d3bb7ed11d66aabce7
# bad: [0a98455666ec87378148a1dde97f1ce5baf75a64] net/mlx4_core: Protect
port type setting by mutex
git bisect bad 0a98455666ec87378148a1dde97f1ce5baf75a64
# bad: [6e8066999800d90d52af5c84ac49ebf683d14cdc] net/mlx4_core: Prevent VF
from changing port configuration
git bisect bad 6e8066999800d90d52af5c84ac49ebf683d14cdc
# bad: [d75b1ade567ffab085e8adbbdacf0092d10cd09c] net: less interrupt
masking in NAPI
git bisect bad d75b1ade567ffab085e8adbbdacf0092d10cd09c
# first bad commit: [d75b1ade567ffab085e8adbbdacf0092d10cd09c]
net: less interrupt masking in NAPI
Could you please solve this issue as it renders my board quite useless.
If you need more info, please ask.
Thanks,
Oded
^ permalink raw reply
* Re: Clarification regarding IFLA_BRPORT_LEARNING_SYNC and aging of fdb entries learnt via br_fdb_external_learn_add()
From: Scott Feldman @ 2015-01-10 20:28 UTC (permalink / raw)
To: Arad, Ronen; +Cc: Netdev, Jiri Pirko, Siva Mannem, marichika4
In-Reply-To: <E4CD12F19ABA0C4D8729E087A761DC3505DDA81C@ORSMSX101.amr.corp.intel.com>
Perfect, I think we have a good working set of use-cases. Thanks for
adding those. Your case 3 seems do-able without too much work since
we already know which ones where externally added, just need another
per-bridge-port flag to turn off bridging aging of externally learned
entries. This will address the performance issue you (and B
Viswanath) raised. What about the entry stats, from the user's
'bridge -s fdb show" perspective for the bridge fdb entries? Will
these numbers match expectations? I think case 1 and case 4 provide a
coherent stats view. Case 3 seems to be lacking in this regard.
On Fri, Jan 9, 2015 at 10:51 PM, Arad, Ronen <ronen.arad@intel.com> wrote:
> [...]
>>> It is indeed simpler. However, if the overhead of reading hit bits from the
>>HW
>>> and updating freshness of entries using br_fdb_external_learn_add() is too
>>> expensive, it would force such platforms to disable learning sync
>>altogether.
>>> Therefore, I believe aging offload flag (could be sufficient at bridge
>>level)
>>> and external aging interval (possibly longer than the software aging
>>interval)
>>> will encourage drivers to use leaning sync.
>>>>-scott
>>
>>I'm not sure I follow that last part.
>>
>>Can we list out the use-cases to see what's missing?
>>
>>Case 1: bridge ages out learned_sync'ed entries
>>
>>bridge port learning: off
>>offload port learning: on
>>offload port learning_sync: on
>>
>>Driver calls br_fdb_external_learn_add() periodically to refresh
>>bridge fdb entry
>>to keep it from going stale.
>>Bridge removes aged out fdb entries (and indirectly tells offload
>>device to do the same).
>>
>>Case 2: offload device/bridge age out entries independently
>>
>>bridge port learning: on
>>offload port learning: on
>>offload port learning_sync: off
>>
>>Bridge ages out its stale learned entries, independent of offload device.
>>Offload device ages out its stale learned entries, independent of bridge.
>>
>>Case 3: ?
>>
>>Please help me finish the use-case list so we can see what's missing.
>
>
> Case 3: offload device ages out external entries and notifies bridge
>
> bridge port learning: on or off (Bridge only learns from packets seen (Rx/Tx))
> offload port learning: on
> offload port learning_sync: on
> bridge aging of external learn: off
> offload device aging: on
>
> Switch port/device driver ages entries (could be by HW aging or soft aging in
> driver/firmware),
> notifies bridge about aged entries using br_fdb_externallearn_del().
> This allows efficient HW aging and batched notification at a pace independent
> of bridge aging interval.
> User still enjoys a single VLAN-aware FDB within the bridge module and having
> all entries in one place. Externally learned entries are identified as such by
> iproute2 "bridge fdb show" command. Device does not have to implement
> ndo_bridge_fdb_dump() for each offload port as the bridge module provides it
> for the common FDB.
>
> Case 4: bridge ages owned and external entries at different intervals
>
> bridge port learning: on (Effectively only for Rx/Tx traffic seen by
> software bridge)
> offload port learning: on (transient traffic and RxTx, overlap with bridge
> learned entries possible)
> offload port learning_sync: on
> bridge aging of external learn: on
> offload device aging: off
> bridge aging interval for owned entries: T1
> bridge aging interval for external entries: T2 (Typically T2 > T1)
>
> This allows for fine-tuning the overhead of periodic updates of entries
> freshness from offload port device.
>
> The bottom line of cases 3-4 is that it is desirable to use the common bridge
> FDB as long as bridge aging of externally learned entries could be controlled
> by the offload device: Either be at a longer interval or disabled.
>
>>
>>-scott
>>--
>>To unsubscribe from this list: send the line "unsubscribe netdev" in
>>the body of a message to majordomo@vger.kernel.org
>>More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH 3/6] netfilter: conntrack: fix race between confirmation and flush
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In-Reply-To: <1420915808-7160-1-git-send-email-pablo@netfilter.org>
Commit 5195c14c8b27c ("netfilter: conntrack: fix race in
__nf_conntrack_confirm against get_next_corpse") aimed to resolve the
race condition between the confirmation (packet path) and the flush
command (from control plane). However, it introduced a crash when
several packets race to add a new conntrack, which seems easier to
reproduce when nf_queue is in place.
Fix this race, in __nf_conntrack_confirm(), by removing the CT
from unconfirmed list before checking the DYING bit. In case
race occured, re-add the CT to the dying list
This patch also changes the verdict from NF_ACCEPT to NF_DROP when
we lose race. Basically, the confirmation happens for the first packet
that we see in a flow. If you just invoked conntrack -F once (which
should be the common case), then this is likely to be the first packet
of the flow (unless you already called flush anytime soon in the past).
This should be hard to trigger, but better drop this packet, otherwise
we leave things in inconsistent state since the destination will likely
reply to this packet, but it will find no conntrack, unless the origin
retransmits.
The change of the verdict has been discussed in:
https://www.marc.info/?l=linux-netdev&m=141588039530056&w=2
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nf_conntrack_core.c | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index a116748..46d1b26 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -611,16 +611,15 @@ __nf_conntrack_confirm(struct sk_buff *skb)
*/
NF_CT_ASSERT(!nf_ct_is_confirmed(ct));
pr_debug("Confirming conntrack %p\n", ct);
- /* We have to check the DYING flag inside the lock to prevent
- a race against nf_ct_get_next_corpse() possibly called from
- user context, else we insert an already 'dead' hash, blocking
- further use of that particular connection -JM */
+ /* We have to check the DYING flag after unlink to prevent
+ * a race against nf_ct_get_next_corpse() possibly called from
+ * user context, else we insert an already 'dead' hash, blocking
+ * further use of that particular connection -JM.
+ */
+ nf_ct_del_from_dying_or_unconfirmed_list(ct);
- if (unlikely(nf_ct_is_dying(ct))) {
- nf_conntrack_double_unlock(hash, reply_hash);
- local_bh_enable();
- return NF_ACCEPT;
- }
+ if (unlikely(nf_ct_is_dying(ct)))
+ goto out;
/* See if there's one in the list already, including reverse:
NAT could have grabbed it without realizing, since we're
@@ -636,8 +635,6 @@ __nf_conntrack_confirm(struct sk_buff *skb)
zone == nf_ct_zone(nf_ct_tuplehash_to_ctrack(h)))
goto out;
- nf_ct_del_from_dying_or_unconfirmed_list(ct);
-
/* Timer relative to confirmation time, not original
setting time, otherwise we'd get timer wrap in
weird delay cases. */
@@ -673,6 +670,7 @@ __nf_conntrack_confirm(struct sk_buff *skb)
return NF_ACCEPT;
out:
+ nf_ct_add_to_dying_list(ct);
nf_conntrack_double_unlock(hash, reply_hash);
NF_CT_STAT_INC(net, insert_failed);
local_bh_enable();
--
1.7.10.4
^ permalink raw reply related
* [PATCH 1/6] ipvs: uninitialized data with IP_VS_IPV6
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In-Reply-To: <1420915808-7160-1-git-send-email-pablo@netfilter.org>
From: Dan Carpenter <dan.carpenter@oracle.com>
The app_tcp_pkt_out() function expects "*diff" to be set and ends up
using uninitialized data if CONFIG_IP_VS_IPV6 is turned on.
The same issue is there in app_tcp_pkt_in(). Thanks to Julian Anastasov
for noticing that.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
net/netfilter/ipvs/ip_vs_ftp.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/net/netfilter/ipvs/ip_vs_ftp.c b/net/netfilter/ipvs/ip_vs_ftp.c
index 1d5341f..5d3daae 100644
--- a/net/netfilter/ipvs/ip_vs_ftp.c
+++ b/net/netfilter/ipvs/ip_vs_ftp.c
@@ -183,6 +183,8 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,
struct nf_conn *ct;
struct net *net;
+ *diff = 0;
+
#ifdef CONFIG_IP_VS_IPV6
/* This application helper doesn't work with IPv6 yet,
* so turn this into a no-op for IPv6 packets
@@ -191,8 +193,6 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,
return 1;
#endif
- *diff = 0;
-
/* Only useful for established sessions */
if (cp->state != IP_VS_TCP_S_ESTABLISHED)
return 1;
@@ -322,6 +322,9 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
struct ip_vs_conn *n_cp;
struct net *net;
+ /* no diff required for incoming packets */
+ *diff = 0;
+
#ifdef CONFIG_IP_VS_IPV6
/* This application helper doesn't work with IPv6 yet,
* so turn this into a no-op for IPv6 packets
@@ -330,9 +333,6 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,
return 1;
#endif
- /* no diff required for incoming packets */
- *diff = 0;
-
/* Only useful for established sessions */
if (cp->state != IP_VS_TCP_S_ESTABLISHED)
return 1;
--
1.7.10.4
^ permalink raw reply related
* [PATCH 0/6] netfilter/ipvs fixes for net
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
Hi David,
The following patchset contains netfilter/ipvs fixes, they are:
1) Small fix for the FTP helper in IPVS, a diff variable may be left
unset when CONFIG_IP_VS_IPV6 is set. Patch from Dan Carpenter.
2) Fix nf_tables port NAT in little endian archs, patch from leroy
christophe.
3) Fix race condition between conntrack confirmation and flush from
userspace. This is the second reincarnation to resolve this problem.
4) Make sure inner messages in the batch come with the nfnetlink header.
5) Relax strict check from nfnetlink_bind() that may break old userspace
applications using all 1s group mask.
6) Schedule removal of chains once no sets and rules refer to them in
the new nf_tables ruleset flush command. Reported by Asbjoern Sloth
Toennesen.
Note that this batch comes later than usual because of the short
winter holidays.
You can pull these changes from:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git
Have a happy new year, thanks!
----------------------------------------------------------------
The following changes since commit ac9a3d84e121196263636f2d38d439a45888005a:
be2net: Fix incorrect setting of tunnel offload flag in netdev features (2014-12-18 12:51:29 -0500)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git master
for you to fetch changes up to a2f18db0c68fec96631c10cad9384c196e9008ac:
netfilter: nf_tables: fix flush ruleset chain dependencies (2015-01-06 22:27:48 +0100)
----------------------------------------------------------------
Dan Carpenter (1):
ipvs: uninitialized data with IP_VS_IPV6
Pablo Neira Ayuso (5):
Merge tag 'ipvs2-for-v3.19' of https://git.kernel.org/.../horms/ipvs-next into ipvs-next
netfilter: conntrack: fix race between confirmation and flush
netfilter: nfnetlink: validate nfnetlink header from batch
netfilter: nfnetlink: relax strict multicast group check from netlink_bind
netfilter: nf_tables: fix flush ruleset chain dependencies
leroy christophe (1):
netfilter: nf_tables: fix port natting in little endian archs
net/ipv4/netfilter/nft_redir_ipv4.c | 8 ++++----
net/ipv6/netfilter/nft_redir_ipv6.c | 8 ++++----
net/netfilter/ipvs/ip_vs_ftp.c | 10 +++++-----
net/netfilter/nf_conntrack_core.c | 20 +++++++++-----------
net/netfilter/nf_tables_api.c | 14 +++++++++-----
net/netfilter/nfnetlink.c | 5 +++--
net/netfilter/nft_nat.c | 8 ++++----
7 files changed, 38 insertions(+), 35 deletions(-)
^ permalink raw reply
* [PATCH 5/6] netfilter: nfnetlink: relax strict multicast group check from netlink_bind
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In-Reply-To: <1420915808-7160-1-git-send-email-pablo@netfilter.org>
Relax the checking that was introduced in 97840cb ("netfilter:
nfnetlink: fix insufficient validation in nfnetlink_bind") when the
subscription bitmask is used. Existing userspace code code may request
to listen to all of the existing netlink groups by setting an all to one
subscription group bitmask. Netlink already validates subscription via
setsockopt() for us.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nfnetlink.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index c6619d4..1aa7049 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -470,7 +470,7 @@ static int nfnetlink_bind(int group)
int type;
if (group <= NFNLGRP_NONE || group > NFNLGRP_MAX)
- return -EINVAL;
+ return 0;
type = nfnl_group2type[group];
--
1.7.10.4
^ permalink raw reply related
* [PATCH 6/6] netfilter: nf_tables: fix flush ruleset chain dependencies
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In-Reply-To: <1420915808-7160-1-git-send-email-pablo@netfilter.org>
Jumping between chains doesn't mix well with flush ruleset. Rules
from a different chain and set elements may still refer to us.
[ 353.373791] ------------[ cut here ]------------
[ 353.373845] kernel BUG at net/netfilter/nf_tables_api.c:1159!
[ 353.373896] invalid opcode: 0000 [#1] SMP
[ 353.373942] Modules linked in: intel_powerclamp uas iwldvm iwlwifi
[ 353.374017] CPU: 0 PID: 6445 Comm: 31c3.nft Not tainted 3.18.0 #98
[ 353.374069] Hardware name: LENOVO 5129CTO/5129CTO, BIOS 6QET47WW (1.17 ) 07/14/2010
[...]
[ 353.375018] Call Trace:
[ 353.375046] [<ffffffff81964c31>] ? nf_tables_commit+0x381/0x540
[ 353.375101] [<ffffffff81949118>] nfnetlink_rcv+0x3d8/0x4b0
[ 353.375150] [<ffffffff81943fc5>] netlink_unicast+0x105/0x1a0
[ 353.375200] [<ffffffff8194438e>] netlink_sendmsg+0x32e/0x790
[ 353.375253] [<ffffffff818f398e>] sock_sendmsg+0x8e/0xc0
[ 353.375300] [<ffffffff818f36b9>] ? move_addr_to_kernel.part.20+0x19/0x70
[ 353.375357] [<ffffffff818f44f9>] ? move_addr_to_kernel+0x19/0x30
[ 353.375410] [<ffffffff819016d2>] ? verify_iovec+0x42/0xd0
[ 353.375459] [<ffffffff818f3e10>] ___sys_sendmsg+0x3f0/0x400
[ 353.375510] [<ffffffff810615fa>] ? native_sched_clock+0x2a/0x90
[ 353.375563] [<ffffffff81176697>] ? acct_account_cputime+0x17/0x20
[ 353.375616] [<ffffffff8110dc78>] ? account_user_time+0x88/0xa0
[ 353.375667] [<ffffffff818f4bbd>] __sys_sendmsg+0x3d/0x80
[ 353.375719] [<ffffffff81b184f4>] ? int_check_syscall_exit_work+0x34/0x3d
[ 353.375776] [<ffffffff818f4c0d>] SyS_sendmsg+0xd/0x20
[ 353.375823] [<ffffffff81b1826d>] system_call_fastpath+0x16/0x1b
Release objects in this order: rules -> sets -> chains -> tables, to
make sure no references to chains are held anymore.
Reported-by: Asbjoern Sloth Toennesen <asbjorn@asbjorn.biz>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nf_tables_api.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 129a8da..3b3ddb4 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -713,16 +713,12 @@ static int nft_flush_table(struct nft_ctx *ctx)
struct nft_chain *chain, *nc;
struct nft_set *set, *ns;
- list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) {
+ list_for_each_entry(chain, &ctx->table->chains, list) {
ctx->chain = chain;
err = nft_delrule_by_chain(ctx);
if (err < 0)
goto out;
-
- err = nft_delchain(ctx);
- if (err < 0)
- goto out;
}
list_for_each_entry_safe(set, ns, &ctx->table->sets, list) {
@@ -735,6 +731,14 @@ static int nft_flush_table(struct nft_ctx *ctx)
goto out;
}
+ list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) {
+ ctx->chain = chain;
+
+ err = nft_delchain(ctx);
+ if (err < 0)
+ goto out;
+ }
+
err = nft_deltable(ctx);
out:
return err;
--
1.7.10.4
^ permalink raw reply related
* [PATCH 4/6] netfilter: nfnetlink: validate nfnetlink header from batch
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In-Reply-To: <1420915808-7160-1-git-send-email-pablo@netfilter.org>
Make sure there is enough room for the nfnetlink header in the
netlink messages that are part of the batch. There is a similar
check in netlink_rcv_skb().
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nfnetlink.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 13c2e17..c6619d4 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -321,7 +321,8 @@ replay:
nlh = nlmsg_hdr(skb);
err = 0;
- if (nlh->nlmsg_len < NLMSG_HDRLEN) {
+ if (nlmsg_len(nlh) < sizeof(struct nfgenmsg) ||
+ skb->len < nlh->nlmsg_len) {
err = -EINVAL;
goto ack;
}
--
1.7.10.4
^ permalink raw reply related
* [PATCH 2/6] netfilter: nf_tables: fix port natting in little endian archs
From: Pablo Neira Ayuso @ 2015-01-10 18:50 UTC (permalink / raw)
To: netfilter-devel; +Cc: davem, netdev
In-Reply-To: <1420915808-7160-1-git-send-email-pablo@netfilter.org>
From: leroy christophe <christophe.leroy@c-s.fr>
Make sure this fetches 16-bits port data from the register.
Remove casting to make sparse happy, not needed anymore.
Signed-off-by: leroy christophe <christophe.leroy@c-s.fr>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/ipv4/netfilter/nft_redir_ipv4.c | 8 ++++----
net/ipv6/netfilter/nft_redir_ipv6.c | 8 ++++----
net/netfilter/nft_nat.c | 8 ++++----
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/net/ipv4/netfilter/nft_redir_ipv4.c b/net/ipv4/netfilter/nft_redir_ipv4.c
index ff2d23d..6ecfce6 100644
--- a/net/ipv4/netfilter/nft_redir_ipv4.c
+++ b/net/ipv4/netfilter/nft_redir_ipv4.c
@@ -27,10 +27,10 @@ static void nft_redir_ipv4_eval(const struct nft_expr *expr,
memset(&mr, 0, sizeof(mr));
if (priv->sreg_proto_min) {
- mr.range[0].min.all = (__force __be16)
- data[priv->sreg_proto_min].data[0];
- mr.range[0].max.all = (__force __be16)
- data[priv->sreg_proto_max].data[0];
+ mr.range[0].min.all =
+ *(__be16 *)&data[priv->sreg_proto_min].data[0];
+ mr.range[0].max.all =
+ *(__be16 *)&data[priv->sreg_proto_max].data[0];
mr.range[0].flags |= NF_NAT_RANGE_PROTO_SPECIFIED;
}
diff --git a/net/ipv6/netfilter/nft_redir_ipv6.c b/net/ipv6/netfilter/nft_redir_ipv6.c
index 2433a6b..11820b6 100644
--- a/net/ipv6/netfilter/nft_redir_ipv6.c
+++ b/net/ipv6/netfilter/nft_redir_ipv6.c
@@ -27,10 +27,10 @@ static void nft_redir_ipv6_eval(const struct nft_expr *expr,
memset(&range, 0, sizeof(range));
if (priv->sreg_proto_min) {
- range.min_proto.all = (__force __be16)
- data[priv->sreg_proto_min].data[0];
- range.max_proto.all = (__force __be16)
- data[priv->sreg_proto_max].data[0];
+ range.min_proto.all =
+ *(__be16 *)&data[priv->sreg_proto_min].data[0];
+ range.max_proto.all =
+ *(__be16 *)&data[priv->sreg_proto_max].data[0];
range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED;
}
diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c
index afe2b0b..aff54fb1 100644
--- a/net/netfilter/nft_nat.c
+++ b/net/netfilter/nft_nat.c
@@ -65,10 +65,10 @@ static void nft_nat_eval(const struct nft_expr *expr,
}
if (priv->sreg_proto_min) {
- range.min_proto.all = (__force __be16)
- data[priv->sreg_proto_min].data[0];
- range.max_proto.all = (__force __be16)
- data[priv->sreg_proto_max].data[0];
+ range.min_proto.all =
+ *(__be16 *)&data[priv->sreg_proto_min].data[0];
+ range.max_proto.all =
+ *(__be16 *)&data[priv->sreg_proto_max].data[0];
range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED;
}
--
1.7.10.4
^ permalink raw reply related
* Re: [PATCH net-next v2] tcp: avoid reducing cwnd when ACK+DSACK is received
From: Eric Dumazet @ 2015-01-10 17:37 UTC (permalink / raw)
To: Sébastien Barré
Cc: Yuchung Cheng, Neal Cardwell, David Miller, Netdev, Gregory Detal,
Nandita Dukkipati
In-Reply-To: <54B11255.7000500@uclouvain.be>
On Sat, 2015-01-10 at 12:51 +0100, Sébastien Barré wrote:
> That looks much more readable compared to my v2.
> It is currently passing our tests (These are in fact MPTCP tests appart
> from Neal's packetdrill that I will add, but actually the MPTCP stack
> happens to reveal this situation quite easily, I think because in MPTCP,
> we store the send queue in the "meta-flow", which currently cannot be
> used for tail loss probes).
>
> As probably everyone will be happy with this (Eric as well ?), I suggest
> I prepare a v3 once all our tests are passed as well, with Yuchung's
> structure and Neal's packetdrill test in the commit text. Will also add
> proper credit as there is now stuff from several people in those few
> lines now :-).
>
> Looks good ?
Definitely !
Thanks !
^ permalink raw reply
* Re: [PATCH 1/3] rtlwifi: btcoexist: Remove some unused functions
From: Larry Finger @ 2015-01-10 17:11 UTC (permalink / raw)
To: Rickard Strandqvist
Cc: Kalle Valo, Masanari Iida, Sachin Kamat, linux-wireless, netdev,
linux-kernel
In-Reply-To: <1420907079-27102-1-git-send-email-rickard_strandqvist@spectrumdigital.se>
On 01/10/2015 10:24 AM, Rickard Strandqvist wrote:
> Removes some functions that are not used anywhere:
> ex_halbtc8821a1ant_periodical() ex_halbtc8821a1ant_pnp_notify()
> ex_halbtc8821a1ant_halt_notify() ex_halbtc8821a1ant_bt_info_notify()
> ex_halbtc8821a1ant_special_packet_notify() ex_halbtc8821a1ant_connect_notify()
> ex_halbtc8821a1ant_scan_notify() ex_halbtc8821a1ant_lps_notify()
> ex_halbtc8821a1ant_ips_notify() ex_halbtc8821a1ant_display_coex_info()
> ex_halbtc8821a1ant_init_coex_dm() ex_halbtc8821a1ant_init_hwconfig()
>
> This was partially found by using a static code analysis program called cppcheck.
>
> Signed-off-by: Rickard Strandqvist <rickard_strandqvist@spectrumdigital.se>
NACK!!!!!!!!!
I told you to stay away from these routines until I finish my update. Not only
might you remove some functions that I will be needing later, but you run the
risk of merge complications.
Kalle: Please ignore EVERYTHING from this person. Obviously, he is incapable of
understanding even the simplest instructions.
Larry
> ---
> .../wireless/rtlwifi/btcoexist/halbtc8821a1ant.c | 707 --------------------
> .../wireless/rtlwifi/btcoexist/halbtc8821a1ant.h | 14 -
> 2 files changed, 721 deletions(-)
>
> diff --git a/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.c b/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.c
> index b72e537..a86e6b6 100644
> --- a/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.c
> +++ b/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.c
> @@ -2213,435 +2213,6 @@ static void halbtc8821a1ant_init_hw_config(struct btc_coexist *btcoexist,
> /*============================================================*/
> /* extern function start with EXhalbtc8821a1ant_*/
> /*============================================================*/
> -void ex_halbtc8821a1ant_init_hwconfig(struct btc_coexist *btcoexist)
> -{
> - halbtc8821a1ant_init_hw_config(btcoexist, true);
> -}
> -
> -void ex_halbtc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
> -{
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
> - "[BTCoex], Coex Mechanism Init!!\n");
> -
> - btcoexist->stop_coex_dm = false;
> -
> - halbtc8821a1ant_init_coex_dm(btcoexist);
> -
> - halbtc8821a1ant_query_bt_info(btcoexist);
> -}
> -
> -void ex_halbtc8821a1ant_display_coex_info(struct btc_coexist *btcoexist)
> -{
> - struct btc_board_info *board_info = &btcoexist->board_info;
> - struct btc_stack_info *stack_info = &btcoexist->stack_info;
> - struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
> - struct rtl_priv *rtlpriv = btcoexist->adapter;
> - u8 u1_tmp[4], i, bt_info_ext, ps_tdma_case = 0;
> - u16 u2_tmp[4];
> - u32 u4_tmp[4];
> - bool roam = false, scan = false, link = false, wifi_under_5g = false;
> - bool bt_hs_on = false, wifi_busy = false;
> - long wifi_rssi = 0, bt_hs_rssi = 0;
> - u32 wifi_bw, wifi_traffic_dir;
> - u8 wifi_dot11_chnl, wifi_hs_chnl;
> - u32 fw_ver = 0, bt_patch_ver = 0;
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n ============[BT Coexist info]============");
> -
> - if (btcoexist->manual_control) {
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n ============[Under Manual Control]============");
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n ==========================================");
> - }
> - if (btcoexist->stop_coex_dm) {
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n ============[Coex is STOPPED]============");
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n ==========================================");
> - }
> -
> - if (!board_info->bt_exist) {
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n BT not exists !!!");
> - return;
> - }
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d/ %d/ %d",
> - "Ant PG Num/ Ant Mech/ Ant Pos:",
> - board_info->pg_ant_num,
> - board_info->btdm_ant_num,
> - board_info->btdm_ant_pos);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %s / %d", "BT stack/ hci ext ver",
> - ((stack_info->profile_notified) ? "Yes" : "No"),
> - stack_info->hci_version);
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
> - &bt_patch_ver);
> - btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
> - "CoexVer/ FwVer/ PatchVer",
> - glcoex_ver_date_8821a_1ant,
> - glcoex_ver_8821a_1ant,
> - fw_ver, bt_patch_ver,
> - bt_patch_ver);
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION,
> - &bt_hs_on);
> - btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
> - &wifi_dot11_chnl);
> - btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL,
> - &wifi_hs_chnl);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d / %d(%d)",
> - "Dot11 channel / HsChnl(HsMode)",
> - wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %02x %02x %02x ",
> - "H2C Wifi inform bt chnl Info",
> - coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
> - coex_dm->wifi_chnl_info[2]);
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
> - btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi",
> - (int)wifi_rssi, (int)bt_hs_rssi);
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",
> - link, roam, scan);
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
> - &wifi_under_5g);
> - btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
> - &wifi_bw);
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,
> - &wifi_busy);
> - btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
> - &wifi_traffic_dir);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %s / %s/ %s ", "Wifi status",
> - (wifi_under_5g ? "5G" : "2.4G"),
> - ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
> - (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
> - ((!wifi_busy) ? "idle" :
> - ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
> - "uplink" : "downlink")));
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]",
> - ((btcoexist->bt_info.bt_disabled) ? ("disabled") :
> - ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
> - ((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
> - coex_dm->bt_status) ?
> - "non-connected idle" :
> - ((BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
> - coex_dm->bt_status) ?
> - "connected-idle" : "busy")))),
> - coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP",
> - bt_link_info->sco_exist,
> - bt_link_info->hid_exist,
> - bt_link_info->pan_exist,
> - bt_link_info->a2dp_exist);
> - btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
> -
> - bt_info_ext = coex_sta->bt_info_ext;
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %s",
> - "BT Info A2DP rate",
> - (bt_info_ext&BIT0) ?
> - "Basic rate" : "EDR rate");
> -
> - for (i = 0; i < BT_INFO_SRC_8821A_1ANT_MAX; i++) {
> - if (coex_sta->bt_info_c2h_cnt[i]) {
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
> - glbt_info_src_8821a_1ant[i],
> - coex_sta->bt_info_c2h[i][0],
> - coex_sta->bt_info_c2h[i][1],
> - coex_sta->bt_info_c2h[i][2],
> - coex_sta->bt_info_c2h[i][3],
> - coex_sta->bt_info_c2h[i][4],
> - coex_sta->bt_info_c2h[i][5],
> - coex_sta->bt_info_c2h[i][6],
> - coex_sta->bt_info_c2h_cnt[i]);
> - }
> - }
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %s/%s, (0x%x/0x%x)",
> - "PS state, IPS/LPS, (lps/rpwm)",
> - ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
> - ((coex_sta->under_Lps ? "LPS ON" : "LPS OFF")),
> - btcoexist->bt_info.lps_val,
> - btcoexist->bt_info.rpwm_val);
> - btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
> -
> - if (!btcoexist->manual_control) {
> - /* Sw mechanism*/
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s", "============[Sw mechanism]============");
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d", "SM[LowPenaltyRA]",
> - coex_dm->cur_low_penalty_ra);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %s/ %s/ %d ",
> - "DelBA/ BtCtrlAgg/ AggSize",
> - (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
> - (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
> - btcoexist->bt_info.agg_buf_size);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x ", "Rate Mask",
> - btcoexist->bt_info.ra_mask);
> -
> - /* Fw mechanism*/
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s",
> - "============[Fw mechanism]============");
> -
> - ps_tdma_case = coex_dm->cur_ps_tdma;
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)",
> - "PS TDMA",
> - coex_dm->ps_tdma_para[0],
> - coex_dm->ps_tdma_para[1],
> - coex_dm->ps_tdma_para[2],
> - coex_dm->ps_tdma_para[3],
> - coex_dm->ps_tdma_para[4],
> - ps_tdma_case,
> - coex_dm->auto_tdma_adjust);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x ",
> - "Latest error condition(should be 0)",
> - coex_dm->error_condition);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d ", "IgnWlanAct",
> - coex_dm->cur_ignore_wlan_act);
> - }
> -
> - /* Hw setting*/
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s", "============[Hw setting]============");
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
> - "backup ARFR1/ARFR2/RL/AMaxTime",
> - coex_dm->backup_arfr_cnt1,
> - coex_dm->backup_arfr_cnt2,
> - coex_dm->backup_retry_limit,
> - coex_dm->backup_ampdu_max_time);
> -
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
> - u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
> - u2_tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
> - "0x430/0x434/0x42a/0x456",
> - u4_tmp[0], u4_tmp[1], u2_tmp[0], u1_tmp[0]);
> -
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc58);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/ 0x%x", "0x778/ 0xc58[29:25]",
> - u1_tmp[0], (u4_tmp[0]&0x3e000000) >> 25);
> -
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x", "0x8db[6:5]",
> - ((u1_tmp[0]&0x60)>>5));
> -
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x975);
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
> - "0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]",
> - (u4_tmp[0] & 0x30000000)>>28,
> - u4_tmp[0] & 0xff,
> - u1_tmp[0] & 0x3);
> -
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
> - u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
> - "0x40/0x4c[24:23]/0x64[0]",
> - u1_tmp[0], ((u4_tmp[0]&0x01800000)>>23), u1_tmp[1]&0x1);
> -
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522",
> - u4_tmp[0], u1_tmp[0]);
> -
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x", "0xc50(dig)",
> - u4_tmp[0]&0xff);
> -
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5d);
> - u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA",
> - u4_tmp[0], (u1_tmp[0]<<8) + u1_tmp[1]);
> -
> - u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
> - u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
> - u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
> - u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
> - "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
> - u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);
> -
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)",
> - coex_sta->high_priority_rx, coex_sta->high_priority_tx);
> - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
> - "\r\n %-35s = %d/ %d", "0x774(low-pri rx/tx)",
> - coex_sta->low_priority_rx, coex_sta->low_priority_tx);
> -#if (BT_AUTO_REPORT_ONLY_8821A_1ANT == 1)
> - halbtc8821a1ant_monitor_bt_ctr(btcoexist);
> -#endif
> - btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
> -}
> -
> -void ex_halbtc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
> -{
> - if (btcoexist->manual_control || btcoexist->stop_coex_dm)
> - return;
> -
> - if (BTC_IPS_ENTER == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], IPS ENTER notify\n");
> - coex_sta->under_ips = true;
> - halbtc8821a1ant_set_ant_path(btcoexist,
> - BTC_ANT_PATH_BT, false, true);
> - /*set PTA control*/
> - halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
> - halbtc8821a1ant_coex_table_with_type(btcoexist,
> - NORMAL_EXEC, 0);
> - } else if (BTC_IPS_LEAVE == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], IPS LEAVE notify\n");
> - coex_sta->under_ips = false;
> -
> - halbtc8821a1ant_run_coexist_mechanism(btcoexist);
> - }
> -}
> -
> -void ex_halbtc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
> -{
> - if (btcoexist->manual_control || btcoexist->stop_coex_dm)
> - return;
> -
> - if (BTC_LPS_ENABLE == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], LPS ENABLE notify\n");
> - coex_sta->under_Lps = true;
> - } else if (BTC_LPS_DISABLE == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], LPS DISABLE notify\n");
> - coex_sta->under_Lps = false;
> - }
> -}
> -
> -void ex_halbtc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
> -{
> - bool wifi_connected = false, bt_hs_on = false;
> -
> - if (btcoexist->manual_control ||
> - btcoexist->stop_coex_dm ||
> - btcoexist->bt_info.bt_disabled)
> - return;
> -
> - btcoexist->btc_get(btcoexist,
> - BTC_GET_BL_HS_OPERATION, &bt_hs_on);
> - btcoexist->btc_get(btcoexist,
> - BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
> -
> - halbtc8821a1ant_query_bt_info(btcoexist);
> -
> - if (coex_sta->c2h_bt_inquiry_page) {
> - halbtc8821a1ant_action_bt_inquiry(btcoexist);
> - return;
> - } else if (bt_hs_on) {
> - halbtc8821a1ant_action_hs(btcoexist);
> - return;
> - }
> -
> - if (BTC_SCAN_START == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], SCAN START notify\n");
> - if (!wifi_connected) {
> - /* non-connected scan*/
> - btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
> - } else {
> - /* wifi is connected*/
> - halbtc8821a1ant_action_wifi_connected_scan(btcoexist);
> - }
> - } else if (BTC_SCAN_FINISH == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], SCAN FINISH notify\n");
> - if (!wifi_connected) {
> - /* non-connected scan*/
> - halbtc8821a1ant_action_wifi_not_connected(btcoexist);
> - } else {
> - halbtc8821a1ant_action_wifi_connected(btcoexist);
> - }
> - }
> -}
> -
> -void ex_halbtc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
> -{
> - bool wifi_connected = false, bt_hs_on = false;
> -
> - if (btcoexist->manual_control ||
> - btcoexist->stop_coex_dm ||
> - btcoexist->bt_info.bt_disabled)
> - return;
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
> - if (coex_sta->c2h_bt_inquiry_page) {
> - halbtc8821a1ant_action_bt_inquiry(btcoexist);
> - return;
> - } else if (bt_hs_on) {
> - halbtc8821a1ant_action_hs(btcoexist);
> - return;
> - }
> -
> - if (BTC_ASSOCIATE_START == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], CONNECT START notify\n");
> - btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
> - } else if (BTC_ASSOCIATE_FINISH == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], CONNECT FINISH notify\n");
> -
> - btcoexist->btc_get(btcoexist,
> - BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
> - if (!wifi_connected) {
> - /* non-connected scan*/
> - halbtc8821a1ant_action_wifi_not_connected(btcoexist);
> - } else {
> - halbtc8821a1ant_action_wifi_connected(btcoexist);
> - }
> - }
> -}
>
> void ex_halbtc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
> u8 type)
> @@ -2690,281 +2261,3 @@ void ex_halbtc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
> btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
> }
>
> -void ex_halbtc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,
> - u8 type)
> -{
> - bool bt_hs_on = false;
> -
> - if (btcoexist->manual_control ||
> - btcoexist->stop_coex_dm ||
> - btcoexist->bt_info.bt_disabled)
> - return;
> -
> - coex_sta->special_pkt_period_cnt = 0;
> -
> - btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
> - if (coex_sta->c2h_bt_inquiry_page) {
> - halbtc8821a1ant_action_bt_inquiry(btcoexist);
> - return;
> - } else if (bt_hs_on) {
> - halbtc8821a1ant_action_hs(btcoexist);
> - return;
> - }
> -
> - if (BTC_PACKET_DHCP == type ||
> - BTC_PACKET_EAPOL == type) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], special Packet(%d) notify\n", type);
> - btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
> - }
> -}
> -
> -void ex_halbtc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,
> - u8 *tmp_buf, u8 length)
> -{
> - u8 bt_info = 0;
> - u8 i, rsp_source = 0;
> - bool wifi_connected = false;
> - bool bt_busy = false;
> - bool wifi_under_5g = false;
> -
> - coex_sta->c2h_bt_info_req_sent = false;
> -
> - btcoexist->btc_get(btcoexist,
> - BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
> -
> - rsp_source = tmp_buf[0]&0xf;
> - if (rsp_source >= BT_INFO_SRC_8821A_1ANT_MAX)
> - rsp_source = BT_INFO_SRC_8821A_1ANT_WIFI_FW;
> - coex_sta->bt_info_c2h_cnt[rsp_source]++;
> -
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], Bt info[%d], length = %d, hex data = [",
> - rsp_source, length);
> - for (i = 0; i < length; i++) {
> - coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
> - if (i == 1)
> - bt_info = tmp_buf[i];
> - if (i == length-1) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "0x%02x]\n", tmp_buf[i]);
> - } else {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "0x%02x, ", tmp_buf[i]);
> - }
> - }
> -
> - if (BT_INFO_SRC_8821A_1ANT_WIFI_FW != rsp_source) {
> - coex_sta->bt_retry_cnt = /* [3:0]*/
> - coex_sta->bt_info_c2h[rsp_source][2]&0xf;
> -
> - coex_sta->bt_rssi =
> - coex_sta->bt_info_c2h[rsp_source][3]*2+10;
> -
> - coex_sta->bt_info_ext =
> - coex_sta->bt_info_c2h[rsp_source][4];
> -
> - /* Here we need to resend some wifi info to BT*/
> - /* because bt is reset and loss of the info.*/
> - if (coex_sta->bt_info_ext & BIT1) {
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
> - btcoexist->btc_get(btcoexist,
> - BTC_GET_BL_WIFI_CONNECTED,
> - &wifi_connected);
> - if (wifi_connected) {
> - ex_halbtc8821a1ant_media_status_notify(btcoexist,
> - BTC_MEDIA_CONNECT);
> - } else {
> - ex_halbtc8821a1ant_media_status_notify(btcoexist,
> - BTC_MEDIA_DISCONNECT);
> - }
> - }
> -
> - if ((coex_sta->bt_info_ext & BIT3) && !wifi_under_5g) {
> - if (!btcoexist->manual_control &&
> - !btcoexist->stop_coex_dm) {
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
> - halbtc8821a1ant_ignore_wlan_act(btcoexist,
> - FORCE_EXEC,
> - false);
> - }
> - }
> -#if (BT_AUTO_REPORT_ONLY_8821A_1ANT == 0)
> - if (!(coex_sta->bt_info_ext & BIT4)) {
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n");
> - halbtc8821a1ant_bt_auto_report(btcoexist,
> - FORCE_EXEC, true);
> - }
> -#endif
> - }
> -
> - /* check BIT2 first ==> check if bt is under inquiry or page scan*/
> - if (bt_info & BT_INFO_8821A_1ANT_B_INQ_PAGE)
> - coex_sta->c2h_bt_inquiry_page = true;
> - else
> - coex_sta->c2h_bt_inquiry_page = false;
> -
> - /* set link exist status*/
> - if (!(bt_info&BT_INFO_8821A_1ANT_B_CONNECTION)) {
> - coex_sta->bt_link_exist = false;
> - coex_sta->pan_exist = false;
> - coex_sta->a2dp_exist = false;
> - coex_sta->hid_exist = false;
> - coex_sta->sco_exist = false;
> - } else {
> - /* connection exists*/
> - coex_sta->bt_link_exist = true;
> - if (bt_info & BT_INFO_8821A_1ANT_B_FTP)
> - coex_sta->pan_exist = true;
> - else
> - coex_sta->pan_exist = false;
> - if (bt_info & BT_INFO_8821A_1ANT_B_A2DP)
> - coex_sta->a2dp_exist = true;
> - else
> - coex_sta->a2dp_exist = false;
> - if (bt_info & BT_INFO_8821A_1ANT_B_HID)
> - coex_sta->hid_exist = true;
> - else
> - coex_sta->hid_exist = false;
> - if (bt_info & BT_INFO_8821A_1ANT_B_SCO_ESCO)
> - coex_sta->sco_exist = true;
> - else
> - coex_sta->sco_exist = false;
> - }
> -
> - halbtc8821a1ant_update_bt_link_info(btcoexist);
> -
> - if (!(bt_info&BT_INFO_8821A_1ANT_B_CONNECTION)) {
> - coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
> - } else if (bt_info == BT_INFO_8821A_1ANT_B_CONNECTION) {
> - /* connection exists but no busy*/
> - coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
> - } else if ((bt_info&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||
> - (bt_info&BT_INFO_8821A_1ANT_B_SCO_BUSY)) {
> - coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
> - } else if (bt_info&BT_INFO_8821A_1ANT_B_ACL_BUSY) {
> - if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
> - coex_dm->auto_tdma_adjust = false;
> - coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
> - } else {
> - coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_MAX;
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
> - }
> -
> - if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
> - (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
> - (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
> - bt_busy = true;
> - else
> - bt_busy = false;
> - btcoexist->btc_set(btcoexist,
> - BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
> -
> - halbtc8821a1ant_run_coexist_mechanism(btcoexist);
> -}
> -
> -void ex_halbtc8821a1ant_halt_notify(struct btc_coexist *btcoexist)
> -{
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], Halt notify\n");
> -
> - btcoexist->stop_coex_dm = true;
> -
> - halbtc8821a1ant_set_ant_path(btcoexist,
> - BTC_ANT_PATH_BT, false, true);
> - halbtc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
> -
> - halbtc8821a1ant_power_save_state(btcoexist,
> - BTC_PS_WIFI_NATIVE, 0x0, 0x0);
> - halbtc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
> -
> - ex_halbtc8821a1ant_media_status_notify(btcoexist,
> - BTC_MEDIA_DISCONNECT);
> -}
> -
> -void ex_halbtc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
> -{
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], Pnp notify\n");
> -
> - if (BTC_WIFI_PNP_SLEEP == pnp_state) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], Pnp notify to SLEEP\n");
> - btcoexist->stop_coex_dm = true;
> - halbtc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
> - halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
> - 0x0, 0x0);
> - halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 9);
> - } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
> - "[BTCoex], Pnp notify to WAKE UP\n");
> - btcoexist->stop_coex_dm = false;
> - halbtc8821a1ant_init_hw_config(btcoexist, false);
> - halbtc8821a1ant_init_coex_dm(btcoexist);
> - halbtc8821a1ant_query_bt_info(btcoexist);
> - }
> -}
> -
> -void
> -ex_halbtc8821a1ant_periodical(
> - struct btc_coexist *btcoexist) {
> - static u8 dis_ver_info_cnt;
> - u32 fw_ver = 0, bt_patch_ver = 0;
> - struct btc_board_info *board_info = &btcoexist->board_info;
> - struct btc_stack_info *stack_info = &btcoexist->stack_info;
> -
> - BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
> - "[BTCoex], ==========================Periodical===========================\n");
> -
> - if (dis_ver_info_cnt <= 5) {
> - dis_ver_info_cnt += 1;
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
> - "[BTCoex], ****************************************************************\n");
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
> - "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
> - board_info->pg_ant_num,
> - board_info->btdm_ant_num,
> - board_info->btdm_ant_pos);
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
> - "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
> - ((stack_info->profile_notified) ? "Yes" : "No"),
> - stack_info->hci_version);
> - btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
> - &bt_patch_ver);
> - btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
> - "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
> - glcoex_ver_date_8821a_1ant,
> - glcoex_ver_8821a_1ant,
> - fw_ver, bt_patch_ver,
> - bt_patch_ver);
> - BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
> - "[BTCoex], ****************************************************************\n");
> - }
> -
> -#if (BT_AUTO_REPORT_ONLY_8821A_1ANT == 0)
> - halbtc8821a1ant_query_bt_info(btcoexist);
> - halbtc8821a1ant_monitor_bt_ctr(btcoexist);
> - btc8821a1ant_mon_bt_en_dis(btcoexist);
> -#else
> - if (halbtc8821a1ant_Is_wifi_status_changed(btcoexist) ||
> - coex_dm->auto_tdma_adjust) {
> - if (coex_sta->special_pkt_period_cnt > 2)
> - halbtc8821a1ant_run_coexist_mechanism(btcoexist);
> - }
> -
> - coex_sta->special_pkt_period_cnt++;
> -#endif
> -}
> diff --git a/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.h b/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.h
> index 20e9048..c3eab15 100644
> --- a/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.h
> +++ b/drivers/net/wireless/rtlwifi/btcoexist/halbtc8821a1ant.h
> @@ -168,21 +168,7 @@ struct coex_sta_8821a_1ant {
> * The following is interface which will notify coex module.
> *===========================================
> */
> -void ex_halbtc8821a1ant_init_hwconfig(struct btc_coexist *btcoexist);
> -void ex_halbtc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist);
> -void ex_halbtc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type);
> -void ex_halbtc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type);
> -void ex_halbtc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type);
> -void ex_halbtc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type);
> void ex_halbtc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
> u8 type);
> -void ex_halbtc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,
> - u8 type);
> -void ex_halbtc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,
> - u8 *tmpbuf, u8 length);
> -void ex_halbtc8821a1ant_halt_notify(struct btc_coexist *btcoexist);
> -void ex_halbtc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnpstate);
> -void ex_halbtc8821a1ant_periodical(struct btc_coexist *btcoexist);
> -void ex_halbtc8821a1ant_display_coex_info(struct btc_coexist *btcoexist);
> void ex_halbtc8821a1ant_dbg_control(struct btc_coexist *btcoexist, u8 op_code,
> u8 op_len, u8 *data);
>
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox