6fae35f9ce
The UWB radio manager coordinates the use of the radio between the PALs that may be using it. PALs request use of the radio with uwb_radio_start() and the radio manager will start beaconing if its not already doing so. When the last PAL has called uwb_radio_stop() beaconing will be stopped. In the future, the radio manager will have a more sophisticated channel selection algorithm, probably following the Channel Selection Policy from the WiMedia Alliance when it is finalized. For now, channel 9 (BG1, TFC1) is selected. The user may override the channel selected by the radio manager and may force the radio to stop beaconing. The WUSB Host Controller PAL makes use of this and there are two new debug PAL commands that can be used for testing. Signed-off-by: David Vrabel <david.vrabel@csr.com>
94 lines
2.2 KiB
C
94 lines
2.2 KiB
C
/*
|
|
* UWB PAL support.
|
|
*
|
|
* Copyright (C) 2008 Cambridge Silicon Radio Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version
|
|
* 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/uwb.h>
|
|
|
|
#include "uwb-internal.h"
|
|
|
|
/**
|
|
* uwb_pal_init - initialize a UWB PAL
|
|
* @pal: the PAL to initialize
|
|
*/
|
|
void uwb_pal_init(struct uwb_pal *pal)
|
|
{
|
|
INIT_LIST_HEAD(&pal->node);
|
|
}
|
|
EXPORT_SYMBOL_GPL(uwb_pal_init);
|
|
|
|
/**
|
|
* uwb_pal_register - register a UWB PAL
|
|
* @pal: the PAL
|
|
*
|
|
* The PAL must be initialized with uwb_pal_init().
|
|
*/
|
|
int uwb_pal_register(struct uwb_pal *pal)
|
|
{
|
|
struct uwb_rc *rc = pal->rc;
|
|
int ret;
|
|
|
|
if (pal->device) {
|
|
ret = sysfs_create_link(&pal->device->kobj,
|
|
&rc->uwb_dev.dev.kobj, "uwb_rc");
|
|
if (ret < 0)
|
|
return ret;
|
|
ret = sysfs_create_link(&rc->uwb_dev.dev.kobj,
|
|
&pal->device->kobj, pal->name);
|
|
if (ret < 0) {
|
|
sysfs_remove_link(&pal->device->kobj, "uwb_rc");
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
mutex_lock(&rc->uwb_dev.mutex);
|
|
list_add(&pal->node, &rc->pals);
|
|
mutex_unlock(&rc->uwb_dev.mutex);
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(uwb_pal_register);
|
|
|
|
/**
|
|
* uwb_pal_register - unregister a UWB PAL
|
|
* @pal: the PAL
|
|
*/
|
|
void uwb_pal_unregister(struct uwb_pal *pal)
|
|
{
|
|
struct uwb_rc *rc = pal->rc;
|
|
|
|
uwb_radio_stop(pal);
|
|
|
|
mutex_lock(&rc->uwb_dev.mutex);
|
|
list_del(&pal->node);
|
|
mutex_unlock(&rc->uwb_dev.mutex);
|
|
|
|
if (pal->device) {
|
|
sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name);
|
|
sysfs_remove_link(&pal->device->kobj, "uwb_rc");
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(uwb_pal_unregister);
|
|
|
|
/**
|
|
* uwb_rc_pal_init - initialize the PAL related parts of a radio controller
|
|
* @rc: the radio controller
|
|
*/
|
|
void uwb_rc_pal_init(struct uwb_rc *rc)
|
|
{
|
|
INIT_LIST_HEAD(&rc->pals);
|
|
}
|