linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mohammed Shafi <shafi.wireless@gmail.com>
To: MR <g7af0ec1e3ea1e7b1@nextmail.ru>
Cc: linux-kernel@vger.kernel.org, linux-wireless@vger.kernel.org,
	Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Subject: Re: ath9k crash 3.2-rc7
Date: Wed, 18 Jan 2012 11:02:24 +0530	[thread overview]
Message-ID: <CAD2nsn1a9q3n3dED1L6bomgsf1fP5TA9Tb9v+q9j=xjqdO2i3Q@mail.gmail.com> (raw)
In-Reply-To: <NEXT-4f15c399e3e1b1.80658410@nextmail.ru>

[-- Attachment #1: Type: text/plain, Size: 1210 bytes --]

2012/1/18 MR <g7af0ec1e3ea1e7b1@nextmail.ru>:
>  >  > Turned out I got lucky previous time.
>  >  >
>  > >This time I went to the other AP, spent some time under it, roamed
> back
>  > and
>  >  >
>  >  >WiFi didn't disappear. I didn't even lose XMPP connections in the
>  > process.
>  >  >
>  >  >
>  >  >Maybe debug printing (which prints a lot) managed to introduce some
>  > extra
>  >  > delays into some race condition.
>  >  >
>  > > I hope I will have time to test this more on Monday. Tomorrow I will
> be
>  >
>  >  > using WiFi less than usual.
>  >
>  >Now I went a few time back and forth, spent a lot of time under
> previously
>  >
>  > risky AP and still there are no problems..
>  >
>  > I wonder if maybe a congested AP could help.. But unclear how to obtain
>  > that quickly and reliably.
>
> Even with debugging off WiFi works reliably across different conditions.
>

you can test frequent roaming with the attached script. also you can
test roaming, after enabling ASPM(attached script, courtesy: Luis)
please completely read and understand
http://linuxwireless.org/en/users/Documentation/ASPM
incorrect tweak may cause hardware issues.

-- 
shafi

[-- Attachment #2: roam-script.sh --]
[-- Type: application/x-sh, Size: 2008 bytes --]

[-- Attachment #3: enable-aspm --]
[-- Type: application/octet-stream, Size: 7310 bytes --]

#!/bin/bash
# Copyright (c) 2010 Luis R. Rodriguez <mcgrof@gmail.com>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.


# ASPM Tuning script
#
# This script lets you enable ASPM on your devices in case your BIOS
# does not have it enabled for some reason. If your BIOS does not have
# it enabled it is usually for a good reason so you should only use this if
# you know what you are doing. Typically you would only need to enable
# ASPM manually when doing development and using a card that typically
# is not present on a laptop, or using the cardbus slot. The BIOS typically
# disables ASPM for foreign cards and on the cardbus slot. Check also
# if you may need to do other things than what is below on your vendor
# documentation.
#
# To use this script You will need for now to at least query your device
# PCI endpoint and root complex addresses using the convention output by
# lspci: [<bus>]:[<slot>].[<func>]
#
# For example:
#
# 03:00.0 Network controller: Atheros Communications Inc. AR9300 Wireless LAN adaptor (rev 01
# 00:1c.1 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 (rev 03)
#
# The root complex for the endpoint can be found using lspci -t
#
# For more details refer to:
#
# http://wireless.kernel.org/en/users/Documentation/ASPM

# You just need to modify these three values:

ROOT_COMPLEX="00:1c.3"
ENDPOINT="05:00.0"

# We'll only enable the last 2 bits by using a mask
# of :3 to setpci, this will ensure we keep the existing
# values on the byte.
#
# Hex  Binary  Meaning
# -------------------------
# 0    0b00    L0 only
# 1    0b01    L0s only
# 2    0b10    L1 only
# 3    0b11    L1 and L0s
ASPM_SETTING=2

function aspm_setting_to_string()
{
	case $1 in
	0)
		echo -e "\t${BLUE}L0 only${NORMAL}, ${RED}ASPM disabled${NORMAL}"
		;;
	1)
		;;
	2)
		echo -e "\t${GREEN}L1 only${NORMAL}"
		;;
	3)
		echo -e "\t${GREEN}L1 and L0s${NORMAL}"
		;;
	*)
		echo -e "\t${RED}Invalid${NORMAL}"
		;;
	esac
}


###################################################################
# Do not edit below here unless you are sending me a patch
###################################################################
#
# TODO: patches are welcomed to me until we submit to to
#       PCI Utilities upstream.
#
# This can be improved by in this order:
#
#	* Accept arguments for endpoint and root complex address, and
#	  desired ASPM settings
#	* Look for your ASPM capabilities by quering your
#	  LnkCap register first. Use these values to let you
#	  select whether you want to enable only L1 or L1 & L0s
#	* Searching for your root complex for you
#	* Search for your PCI device by using the driver
#	* Disable your driver and ask to reboot ?
#	* Rewrite in C
#	* Write ncurses interface [ wishlist ]
#	* Write GTK/QT interface [ wishlist ]
#	* Submit upstream as aspm.c to the PCI Utilities, which are
#	  maintained by Martin Mares <mj@ucw.cz>

# Pretty colors
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
NORMAL="\033[00m"
BLUE="\033[34m"
RED="\033[31m"
PURPLE="\033[35m"
CYAN="\033[36m"
UNDERLINE="\033[02m"

# we can surely read the spec to get a better value
MAX_SEARCH=20
SEARCH_COUNT=1
ASPM_BYTE_ADDRESS="INVALID"

ROOT_PRESENT=$(lspci | grep -c "$ROOT_COMPLEXT")
ENDPOINT_PRESENT=$(lspci | grep -c "$ENDPOINT")

if [[ $(id -u) != 0 ]]; then
	echo "This needs to be run as root"
	exit 1
fi

if [[ $ROOT_PRESENT -eq 0 ]]; then
	echo "Root complex $ROOT_COMPLEX is not present"
	exit
fi

if [[ $ENDPOINT_PRESENT -eq 0 ]]; then
	echo "Endpoint $ENDPOINT is not present"
	exit
fi

# XXX: lspci -s some_device_not_existing does not return positive
# if the device does not exist, fix this upstream
function device_present()
{

	PRESENT=$(lspci | grep -c "$1")
	COMPLAINT="${RED}not present${NORMAL}"

	if [[ $PRESENT -eq 0 ]]; then
		if [[ $2 != "present" ]]; then
			COMPLAINT="${RED}disappeared${NORMAL}"
		fi

		echo -e "Device ${BLUE}${1}${NORMAL} $COMPLAINT" 
		return 1
	fi
	return 0
}

function find_aspm_byte_address()
{
	device_present $ENDPOINT present
	if [[ $? -ne 0 ]]; then
		exit
	fi

	SEARCH=$(setpci -s $1 34.b)
	# We know on the first search $SEARCH will not be
	# 10 but this simplifies the implementation.
	while [[ $SEARCH != 10 && $SEARCH_COUNT -le $MAX_SEARCH ]]; do
		END_SEARCH=$(setpci -s $1 ${SEARCH}.b)

		# Convert hex digits to uppercase for bc
		SEARCH_UPPER=$(printf "%X" 0x${SEARCH})

		if [[ $END_SEARCH = 10 ]]; then
			ASPM_BYTE_ADDRESS=$(echo "obase=16; ibase=16; $SEARCH_UPPER + 10" | bc)
			break
		fi

		SEARCH=$(echo "obase=16; ibase=16; $SEARCH + 1" | bc)
		SEARCH=$(setpci -s $1 ${SEARCH}.b)

		let SEARCH_COUNT=$SEARCH_COUNT+1
	done

	if [[ $SEARCH_COUNT -ge $MAX_SEARCH ]]; then
		echo -e "Long loop while looking for ASPM word for $1"
		return 1
	fi
	return 0
}

function enable_aspm_byte()
{
	device_present $1 present
	if [[ $? -ne 0 ]]; then
		exit
	fi

	find_aspm_byte_address $1
	if [[ $? -ne 0 ]]; then
		return 1
	fi

	ASPM_BYTE_HEX=$(setpci -s $1 ${ASPM_BYTE_ADDRESS}.b)
	ASPM_BYTE_HEX=$(printf "%X" 0x${ASPM_BYTE_HEX})
	# setpci doesn't support a mask on the query yet, only on the set,
	# so to verify a setting on a mask we have no other optoin but
	# to do do this stuff ourselves.
	DESIRED_ASPM_BYTE_HEX=$(printf "%X" $(( (0x${ASPM_BYTE_HEX} & ~0x7) |0x${ASPM_SETTING})))

	if [[ $ASPM_BYTE_ADDRESS = "INVALID" ]]; then
		echo -e "No ASPM byte could be found for $(lspci -s $1)"
		return
	fi

	echo -e "$(lspci -s $1)"
	echo -en "\t${YELLOW}0x${ASPM_BYTE_ADDRESS}${NORMAL} : ${CYAN}0x${ASPM_BYTE_HEX}${GREEN} --> ${BLUE}0x${DESIRED_ASPM_BYTE_HEX}${NORMAL} ... "

	device_present $1 present
	if [[ $? -ne 0 ]]; then
		exit
	fi

	# Avoid setting if already set
	if [[ $ASPM_BYTE_HEX = $DESIRED_ASPM_BYTE_HEX ]]; then
		echo -e "[${GREEN}SUCESS${NORMAL}] (${GREEN}already set${NORMAL})"
		aspm_setting_to_string $ASPM_SETTING
		return 0
	fi

	# This only writes the last 3 bits
	setpci -s $1 ${ASPM_BYTE_ADDRESS}.b=${ASPM_SETTING}:3

	sleep 3

	ACTUAL_ASPM_BYTE_HEX=$(setpci -s $1 ${ASPM_BYTE_ADDRESS}.b)
	ACTUAL_ASPM_BYTE_HEX=$(printf "%X" 0x${ACTUAL_ASPM_BYTE_HEX})

	# Do not retry this if it failed, if it failed to set.
	# Likey if it failed its a good reason and you should look
	# into that.
	if [[ $ACTUAL_ASPM_BYTE_HEX != $DESIRED_ASPM_BYTE_HEX ]]; then
		echo -e "\t[${RED}FAIL${NORMAL}] (0x${ACTUAL_ASPM_BYTE_HEX})"
		return 1
	fi

	echo -e "\t[${GREEN}SUCCESS]${NORMAL}]"
	aspm_setting_to_string $ASPM_SETTING

	return 0
}

device_present $ENDPOINT not_sure
if [[ $? -ne 0 ]]; then
	exit
fi

echo -e "${CYAN}Root complex${NORMAL}:"
enable_aspm_byte $ROOT_COMPLEX
echo

echo -e "${CYAN}Endpoint${NORMAL}:"
enable_aspm_byte $ENDPOINT
echo

  reply	other threads:[~2012-01-18  5:32 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-17 18:53 ath9k crash 3.2-rc7 MR
2012-01-18  5:32 ` Mohammed Shafi [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-01-26 22:19 MR
2012-01-20  4:42 MR
2012-01-20  5:16 ` Mohammed Shafi
2012-01-18 17:30 MR
2012-01-16 15:52 MR
2012-01-12 18:04 MR
2012-01-11 17:20 MR
2012-01-12  6:06 ` Mohammed Shafi
2012-01-10 18:14 MR
2012-01-11 15:26 ` Mohammed Shafi
2012-01-09 11:11 MR
2012-01-09  7:40 MR
2012-01-09  7:57 ` Mohammed Shafi
2012-01-09  7:05 MR
2012-01-09  7:30 ` Mohammed Shafi
2012-01-08  7:19 MR
2012-01-09  5:11 ` Mohammed Shafi
2012-01-07 12:11 MR
2012-01-06 20:55 MR
2012-01-07 11:48 ` Mohammed Shafi
2012-01-06 14:46 MR
2012-01-06 14:50 ` Mohammed Shafi
2012-01-06 12:51 MR
2012-01-06 14:35 ` Mohammed Shafi
2012-01-06 14:41   ` Mohammed Shafi
2012-01-06  8:10 MR
2012-01-06  8:01 MR
2012-01-06  9:02 ` Mohammed Shafi
     [not found] <NEXT-4f069dda9267d2.27061318@nextmail.ru>
     [not found] ` <CAD2nsn3i=HTP6zOEADMx35rOYXDofo7YG+0zCGH36XgZFLfOww@mail.gmail.com>
2012-01-06  7:49   ` Mohammed Shafi
2012-01-05 18:52 MR
2012-01-05 16:32 MR
2012-01-05  6:59 MR
2012-01-05 15:30 ` Mohammed Shafi
2012-01-04 21:18 MR
2012-01-04 21:28 ` John W. Linville
2012-01-05  6:29   ` Mohammed Shafi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAD2nsn1a9q3n3dED1L6bomgsf1fP5TA9Tb9v+q9j=xjqdO2i3Q@mail.gmail.com' \
    --to=shafi.wireless@gmail.com \
    --cc=g7af0ec1e3ea1e7b1@nextmail.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=rmanohar@qca.qualcomm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).