Merge branch 'merge'
This commit is contained in:
@@ -285,6 +285,8 @@ static int __init acpi_ac_init(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
acpi_ac_dir = acpi_lock_ac_dir();
|
||||
if (!acpi_ac_dir)
|
||||
|
||||
@@ -484,10 +484,8 @@ acpi_memory_register_notify_handler(acpi_handle handle,
|
||||
|
||||
|
||||
status = is_memory_device(handle);
|
||||
if (ACPI_FAILURE(status)){
|
||||
ACPI_EXCEPTION((AE_INFO, status, "handle is no memory device"));
|
||||
if (ACPI_FAILURE(status))
|
||||
return AE_OK; /* continue */
|
||||
}
|
||||
|
||||
status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
|
||||
acpi_memory_device_notify, NULL);
|
||||
@@ -503,10 +501,8 @@ acpi_memory_deregister_notify_handler(acpi_handle handle,
|
||||
|
||||
|
||||
status = is_memory_device(handle);
|
||||
if (ACPI_FAILURE(status)){
|
||||
ACPI_EXCEPTION((AE_INFO, status, "handle is no memory device"));
|
||||
if (ACPI_FAILURE(status))
|
||||
return AE_OK; /* continue */
|
||||
}
|
||||
|
||||
status = acpi_remove_notify_handler(handle,
|
||||
ACPI_SYSTEM_NOTIFY,
|
||||
|
||||
@@ -757,6 +757,9 @@ static int __init acpi_battery_init(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
acpi_battery_dir = acpi_lock_battery_dir();
|
||||
if (!acpi_battery_dir)
|
||||
return -ENODEV;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/pm.h>
|
||||
@@ -68,7 +69,8 @@ int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device)
|
||||
|
||||
status = acpi_get_data(handle, acpi_bus_data_handler, (void **)device);
|
||||
if (ACPI_FAILURE(status) || !*device) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "No context for object [%p]", handle));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No context for object [%p]\n",
|
||||
handle));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -192,7 +194,7 @@ int acpi_bus_set_power(acpi_handle handle, int state)
|
||||
/* Make sure this is a valid target state */
|
||||
|
||||
if (!device->flags.power_manageable) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device `[%s]' is not power manageable",
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device `[%s]' is not power manageable\n",
|
||||
device->kobj.name));
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -738,7 +740,10 @@ static int __init acpi_init(void)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
firmware_register(&acpi_subsys);
|
||||
result = firmware_register(&acpi_subsys);
|
||||
if (result < 0)
|
||||
printk(KERN_WARNING "%s: firmware_register error: %d\n",
|
||||
__FUNCTION__, result);
|
||||
|
||||
result = acpi_bus_init();
|
||||
|
||||
|
||||
@@ -91,6 +91,14 @@ enum {
|
||||
HK_EVENT_ENTERRING_S5,
|
||||
};
|
||||
|
||||
enum conf_entry_enum {
|
||||
bus_handle = 0,
|
||||
bus_method = 1,
|
||||
action_handle = 2,
|
||||
method = 3,
|
||||
LAST_CONF_ENTRY
|
||||
};
|
||||
|
||||
/* procdir we use */
|
||||
static struct proc_dir_entry *hotkey_proc_dir;
|
||||
static struct proc_dir_entry *hotkey_config;
|
||||
@@ -244,19 +252,15 @@ static int hotkey_info_open_fs(struct inode *inode, struct file *file)
|
||||
|
||||
static char *format_result(union acpi_object *object)
|
||||
{
|
||||
char *buf = NULL;
|
||||
|
||||
buf = (char *)kmalloc(RESULT_STR_LEN, GFP_KERNEL);
|
||||
if (buf)
|
||||
memset(buf, 0, RESULT_STR_LEN);
|
||||
else
|
||||
goto do_fail;
|
||||
char *buf;
|
||||
|
||||
buf = kzalloc(RESULT_STR_LEN, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
/* Now, just support integer type */
|
||||
if (object->type == ACPI_TYPE_INTEGER)
|
||||
sprintf(buf, "%d\n", (u32) object->integer.value);
|
||||
do_fail:
|
||||
return (buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
static int hotkey_polling_seq_show(struct seq_file *seq, void *offset)
|
||||
@@ -486,98 +490,102 @@ static void free_hotkey_device(union acpi_hotkey *key)
|
||||
|
||||
static void free_hotkey_buffer(union acpi_hotkey *key)
|
||||
{
|
||||
/* key would never be null, action method could be */
|
||||
kfree(key->event_hotkey.action_method);
|
||||
}
|
||||
|
||||
static void free_poll_hotkey_buffer(union acpi_hotkey *key)
|
||||
{
|
||||
/* key would never be null, others could be*/
|
||||
kfree(key->poll_hotkey.action_method);
|
||||
kfree(key->poll_hotkey.poll_method);
|
||||
kfree(key->poll_hotkey.poll_result);
|
||||
}
|
||||
static int
|
||||
init_hotkey_device(union acpi_hotkey *key, char *bus_str, char *action_str,
|
||||
char *method, int std_num, int external_num)
|
||||
init_hotkey_device(union acpi_hotkey *key, char **config_entry,
|
||||
int std_num, int external_num)
|
||||
{
|
||||
acpi_handle tmp_handle;
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
|
||||
if (std_num < 0 || IS_POLL(std_num) || !key)
|
||||
goto do_fail;
|
||||
|
||||
if (!bus_str || !action_str || !method)
|
||||
if (!config_entry[bus_handle] || !config_entry[action_handle]
|
||||
|| !config_entry[method])
|
||||
goto do_fail;
|
||||
|
||||
key->link.hotkey_type = ACPI_HOTKEY_EVENT;
|
||||
key->link.hotkey_standard_num = std_num;
|
||||
key->event_hotkey.flag = 0;
|
||||
key->event_hotkey.action_method = method;
|
||||
key->event_hotkey.action_method = config_entry[method];
|
||||
|
||||
status =
|
||||
acpi_get_handle(NULL, bus_str, &(key->event_hotkey.bus_handle));
|
||||
status = acpi_get_handle(NULL, config_entry[bus_handle],
|
||||
&(key->event_hotkey.bus_handle));
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
key->event_hotkey.external_hotkey_num = external_num;
|
||||
status =
|
||||
acpi_get_handle(NULL, action_str,
|
||||
status = acpi_get_handle(NULL, config_entry[action_handle],
|
||||
&(key->event_hotkey.action_handle));
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
status = acpi_get_handle(key->event_hotkey.action_handle,
|
||||
method, &tmp_handle);
|
||||
config_entry[method], &tmp_handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
return AE_OK;
|
||||
do_fail:
|
||||
do_fail_zero:
|
||||
key->event_hotkey.action_method = NULL;
|
||||
do_fail:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int
|
||||
init_poll_hotkey_device(union acpi_hotkey *key,
|
||||
char *poll_str,
|
||||
char *poll_method,
|
||||
char *action_str, char *action_method, int std_num)
|
||||
init_poll_hotkey_device(union acpi_hotkey *key, char **config_entry,
|
||||
int std_num)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
acpi_handle tmp_handle;
|
||||
|
||||
|
||||
if (std_num < 0 || IS_EVENT(std_num) || !key)
|
||||
goto do_fail;
|
||||
|
||||
if (!poll_str || !poll_method || !action_str || !action_method)
|
||||
if (!config_entry[bus_handle] ||!config_entry[bus_method] ||
|
||||
!config_entry[action_handle] || !config_entry[method])
|
||||
goto do_fail;
|
||||
|
||||
key->link.hotkey_type = ACPI_HOTKEY_POLLING;
|
||||
key->link.hotkey_standard_num = std_num;
|
||||
key->poll_hotkey.flag = 0;
|
||||
key->poll_hotkey.poll_method = poll_method;
|
||||
key->poll_hotkey.action_method = action_method;
|
||||
key->poll_hotkey.poll_method = config_entry[bus_method];
|
||||
key->poll_hotkey.action_method = config_entry[method];
|
||||
|
||||
status =
|
||||
acpi_get_handle(NULL, poll_str, &(key->poll_hotkey.poll_handle));
|
||||
status = acpi_get_handle(NULL, config_entry[bus_handle],
|
||||
&(key->poll_hotkey.poll_handle));
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
status = acpi_get_handle(key->poll_hotkey.poll_handle,
|
||||
poll_method, &tmp_handle);
|
||||
config_entry[bus_method], &tmp_handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
status =
|
||||
acpi_get_handle(NULL, action_str,
|
||||
acpi_get_handle(NULL, config_entry[action_handle],
|
||||
&(key->poll_hotkey.action_handle));
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
status = acpi_get_handle(key->poll_hotkey.action_handle,
|
||||
action_method, &tmp_handle);
|
||||
config_entry[method], &tmp_handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
key->poll_hotkey.poll_result =
|
||||
(union acpi_object *)kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
if (!key->poll_hotkey.poll_result)
|
||||
goto do_fail;
|
||||
goto do_fail_zero;
|
||||
return AE_OK;
|
||||
do_fail:
|
||||
|
||||
do_fail_zero:
|
||||
key->poll_hotkey.poll_method = NULL;
|
||||
key->poll_hotkey.action_method = NULL;
|
||||
do_fail:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -652,17 +660,18 @@ static int hotkey_poll_config_seq_show(struct seq_file *seq, void *offset)
|
||||
}
|
||||
|
||||
static int
|
||||
get_parms(char *config_record,
|
||||
int *cmd,
|
||||
char **bus_handle,
|
||||
char **bus_method,
|
||||
char **action_handle,
|
||||
char **method, int *internal_event_num, int *external_event_num)
|
||||
get_parms(char *config_record, int *cmd, char **config_entry,
|
||||
int *internal_event_num, int *external_event_num)
|
||||
{
|
||||
/* the format of *config_record =
|
||||
* "1:\d+:*" : "cmd:internal_event_num"
|
||||
* "\d+:\w+:\w+:\w+:\w+:\d+:\d+" :
|
||||
* "cmd:bus_handle:bus_method:action_handle:method:internal_event_num:external_event_num"
|
||||
*/
|
||||
char *tmp, *tmp1, count;
|
||||
int i;
|
||||
|
||||
sscanf(config_record, "%d", cmd);
|
||||
|
||||
if (*cmd == 1) {
|
||||
if (sscanf(config_record, "%d:%d", cmd, internal_event_num) !=
|
||||
2)
|
||||
@@ -674,59 +683,27 @@ get_parms(char *config_record,
|
||||
if (!tmp)
|
||||
goto do_fail;
|
||||
tmp++;
|
||||
tmp1 = strchr(tmp, ':');
|
||||
if (!tmp1)
|
||||
goto do_fail;
|
||||
|
||||
count = tmp1 - tmp;
|
||||
*bus_handle = (char *)kmalloc(count + 1, GFP_KERNEL);
|
||||
if (!*bus_handle)
|
||||
goto do_fail;
|
||||
strncpy(*bus_handle, tmp, count);
|
||||
*(*bus_handle + count) = 0;
|
||||
|
||||
tmp = tmp1;
|
||||
tmp++;
|
||||
tmp1 = strchr(tmp, ':');
|
||||
if (!tmp1)
|
||||
goto do_fail;
|
||||
count = tmp1 - tmp;
|
||||
*bus_method = (char *)kmalloc(count + 1, GFP_KERNEL);
|
||||
if (!*bus_method)
|
||||
goto do_fail;
|
||||
strncpy(*bus_method, tmp, count);
|
||||
*(*bus_method + count) = 0;
|
||||
|
||||
tmp = tmp1;
|
||||
tmp++;
|
||||
tmp1 = strchr(tmp, ':');
|
||||
if (!tmp1)
|
||||
goto do_fail;
|
||||
count = tmp1 - tmp;
|
||||
*action_handle = (char *)kmalloc(count + 1, GFP_KERNEL);
|
||||
if (!*action_handle)
|
||||
goto do_fail;
|
||||
strncpy(*action_handle, tmp, count);
|
||||
*(*action_handle + count) = 0;
|
||||
|
||||
tmp = tmp1;
|
||||
tmp++;
|
||||
tmp1 = strchr(tmp, ':');
|
||||
if (!tmp1)
|
||||
goto do_fail;
|
||||
count = tmp1 - tmp;
|
||||
*method = (char *)kmalloc(count + 1, GFP_KERNEL);
|
||||
if (!*method)
|
||||
goto do_fail;
|
||||
strncpy(*method, tmp, count);
|
||||
*(*method + count) = 0;
|
||||
|
||||
if (sscanf(tmp1 + 1, "%d:%d", internal_event_num, external_event_num) <=
|
||||
0)
|
||||
goto do_fail;
|
||||
|
||||
return 6;
|
||||
do_fail:
|
||||
for (i = 0; i < LAST_CONF_ENTRY; i++) {
|
||||
tmp1 = strchr(tmp, ':');
|
||||
if (!tmp1) {
|
||||
goto do_fail;
|
||||
}
|
||||
count = tmp1 - tmp;
|
||||
config_entry[i] = kzalloc(count + 1, GFP_KERNEL);
|
||||
if (!config_entry[i])
|
||||
goto handle_failure;
|
||||
strncpy(config_entry[i], tmp, count);
|
||||
tmp = tmp1 + 1;
|
||||
}
|
||||
if (sscanf(tmp, "%d:%d", internal_event_num, external_event_num) <= 0)
|
||||
goto handle_failure;
|
||||
if (!IS_OTHERS(*internal_event_num)) {
|
||||
return 6;
|
||||
}
|
||||
handle_failure:
|
||||
while (i-- > 0)
|
||||
kfree(config_entry[i]);
|
||||
do_fail:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -736,50 +713,34 @@ static ssize_t hotkey_write_config(struct file *file,
|
||||
size_t count, loff_t * data)
|
||||
{
|
||||
char *config_record = NULL;
|
||||
char *bus_handle = NULL;
|
||||
char *bus_method = NULL;
|
||||
char *action_handle = NULL;
|
||||
char *method = NULL;
|
||||
char *config_entry[LAST_CONF_ENTRY];
|
||||
int cmd, internal_event_num, external_event_num;
|
||||
int ret = 0;
|
||||
union acpi_hotkey *key = NULL;
|
||||
union acpi_hotkey *key = kzalloc(sizeof(union acpi_hotkey), GFP_KERNEL);
|
||||
|
||||
|
||||
config_record = (char *)kmalloc(count + 1, GFP_KERNEL);
|
||||
if (!config_record)
|
||||
if (!key)
|
||||
return -ENOMEM;
|
||||
|
||||
config_record = kzalloc(count + 1, GFP_KERNEL);
|
||||
if (!config_record) {
|
||||
kfree(key);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (copy_from_user(config_record, buffer, count)) {
|
||||
kfree(config_record);
|
||||
kfree(key);
|
||||
printk(KERN_ERR PREFIX "Invalid data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
config_record[count] = 0;
|
||||
|
||||
ret = get_parms(config_record,
|
||||
&cmd,
|
||||
&bus_handle,
|
||||
&bus_method,
|
||||
&action_handle,
|
||||
&method, &internal_event_num, &external_event_num);
|
||||
|
||||
ret = get_parms(config_record, &cmd, config_entry,
|
||||
&internal_event_num, &external_event_num);
|
||||
kfree(config_record);
|
||||
if (IS_OTHERS(internal_event_num))
|
||||
goto do_fail;
|
||||
if (ret != 6) {
|
||||
do_fail:
|
||||
kfree(bus_handle);
|
||||
kfree(bus_method);
|
||||
kfree(action_handle);
|
||||
kfree(method);
|
||||
printk(KERN_ERR PREFIX "Invalid data format ret=%d\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
key = kmalloc(sizeof(union acpi_hotkey), GFP_KERNEL);
|
||||
if (!key)
|
||||
goto do_fail;
|
||||
memset(key, 0, sizeof(union acpi_hotkey));
|
||||
if (cmd == 1) {
|
||||
union acpi_hotkey *tmp = NULL;
|
||||
tmp = get_hotkey_by_event(&global_hotkey_list,
|
||||
@@ -791,34 +752,19 @@ static ssize_t hotkey_write_config(struct file *file,
|
||||
goto cont_cmd;
|
||||
}
|
||||
if (IS_EVENT(internal_event_num)) {
|
||||
kfree(bus_method);
|
||||
ret = init_hotkey_device(key, bus_handle, action_handle, method,
|
||||
internal_event_num,
|
||||
external_event_num);
|
||||
} else
|
||||
ret = init_poll_hotkey_device(key, bus_handle, bus_method,
|
||||
action_handle, method,
|
||||
internal_event_num);
|
||||
if (ret) {
|
||||
kfree(bus_handle);
|
||||
kfree(action_handle);
|
||||
if (IS_EVENT(internal_event_num))
|
||||
free_hotkey_buffer(key);
|
||||
else
|
||||
free_poll_hotkey_buffer(key);
|
||||
kfree(key);
|
||||
printk(KERN_ERR PREFIX "Invalid hotkey\n");
|
||||
return -EINVAL;
|
||||
if (init_hotkey_device(key, config_entry,
|
||||
internal_event_num, external_event_num))
|
||||
goto init_hotkey_fail;
|
||||
} else {
|
||||
if (init_poll_hotkey_device(key, config_entry,
|
||||
internal_event_num))
|
||||
goto init_poll_hotkey_fail;
|
||||
}
|
||||
|
||||
cont_cmd:
|
||||
kfree(bus_handle);
|
||||
kfree(action_handle);
|
||||
|
||||
cont_cmd:
|
||||
switch (cmd) {
|
||||
case 0:
|
||||
if (get_hotkey_by_event
|
||||
(&global_hotkey_list, key->link.hotkey_standard_num))
|
||||
if (get_hotkey_by_event(&global_hotkey_list,
|
||||
key->link.hotkey_standard_num))
|
||||
goto fail_out;
|
||||
else
|
||||
hotkey_add(key);
|
||||
@@ -827,6 +773,7 @@ static ssize_t hotkey_write_config(struct file *file,
|
||||
hotkey_remove(key);
|
||||
break;
|
||||
case 2:
|
||||
/* key is kfree()ed if matched*/
|
||||
if (hotkey_update(key))
|
||||
goto fail_out;
|
||||
break;
|
||||
@@ -835,11 +782,22 @@ static ssize_t hotkey_write_config(struct file *file,
|
||||
break;
|
||||
}
|
||||
return count;
|
||||
fail_out:
|
||||
if (IS_EVENT(internal_event_num))
|
||||
free_hotkey_buffer(key);
|
||||
else
|
||||
free_poll_hotkey_buffer(key);
|
||||
|
||||
init_poll_hotkey_fail: /* failed init_poll_hotkey_device */
|
||||
kfree(config_entry[bus_method]);
|
||||
config_entry[bus_method] = NULL;
|
||||
init_hotkey_fail: /* failed init_hotkey_device */
|
||||
kfree(config_entry[method]);
|
||||
fail_out:
|
||||
kfree(config_entry[bus_handle]);
|
||||
kfree(config_entry[action_handle]);
|
||||
/* No double free since elements =NULL for error cases */
|
||||
if (IS_EVENT(internal_event_num)) {
|
||||
if (config_entry[bus_method])
|
||||
kfree(config_entry[bus_method]);
|
||||
free_hotkey_buffer(key); /* frees [method] */
|
||||
} else
|
||||
free_poll_hotkey_buffer(key); /* frees [bus_method]+[method] */
|
||||
kfree(key);
|
||||
printk(KERN_ERR PREFIX "invalid key\n");
|
||||
return -EINVAL;
|
||||
@@ -923,10 +881,9 @@ static ssize_t hotkey_execute_aml_method(struct file *file,
|
||||
union acpi_hotkey *key;
|
||||
|
||||
|
||||
arg = (char *)kmalloc(count + 1, GFP_KERNEL);
|
||||
arg = kzalloc(count + 1, GFP_KERNEL);
|
||||
if (!arg)
|
||||
return -ENOMEM;
|
||||
arg[count] = 0;
|
||||
|
||||
if (copy_from_user(arg, buffer, count)) {
|
||||
kfree(arg);
|
||||
|
||||
@@ -330,7 +330,7 @@ static int acpi_ec_hc_add(struct acpi_device *device)
|
||||
status = acpi_evaluate_integer(ec_hc->handle, "_EC", NULL, &val);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Error obtaining _EC\n"));
|
||||
kfree(ec_hc->smbus);
|
||||
kfree(ec_hc);
|
||||
kfree(smbus);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -746,6 +746,16 @@ acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Waiting for semaphore[%p|%d|%d]\n",
|
||||
handle, units, timeout));
|
||||
|
||||
/*
|
||||
* This can be called during resume with interrupts off.
|
||||
* Like boot-time, we should be single threaded and will
|
||||
* always get the lock if we try -- timeout or not.
|
||||
* If this doesn't succeed, then we will oops courtesy of
|
||||
* might_sleep() in down().
|
||||
*/
|
||||
if (!down_trylock(sem))
|
||||
return AE_OK;
|
||||
|
||||
switch (timeout) {
|
||||
/*
|
||||
* No Wait:
|
||||
|
||||
@@ -1714,6 +1714,9 @@ static int __init acpi_sbs_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
init_MUTEX(&sbs_sem);
|
||||
|
||||
if (capacity_mode != DEF_CAPACITY_UNIT
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <acpi/acpi_drivers.h>
|
||||
@@ -113,6 +114,8 @@ static struct kset acpi_namespace_kset = {
|
||||
static void acpi_device_register(struct acpi_device *device,
|
||||
struct acpi_device *parent)
|
||||
{
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Linkage
|
||||
* -------
|
||||
@@ -138,7 +141,10 @@ static void acpi_device_register(struct acpi_device *device,
|
||||
device->kobj.parent = &parent->kobj;
|
||||
device->kobj.ktype = &ktype_acpi_ns;
|
||||
device->kobj.kset = &acpi_namespace_kset;
|
||||
kobject_register(&device->kobj);
|
||||
err = kobject_register(&device->kobj);
|
||||
if (err < 0)
|
||||
printk(KERN_WARNING "%s: kobject_register error: %d\n",
|
||||
__FUNCTION__, err);
|
||||
create_sysfs_device_files(device);
|
||||
}
|
||||
|
||||
@@ -1450,7 +1456,9 @@ static int __init acpi_scan_init(void)
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
kset_register(&acpi_namespace_kset);
|
||||
result = kset_register(&acpi_namespace_kset);
|
||||
if (result < 0)
|
||||
printk(KERN_ERR PREFIX "kset_register error: %d\n", result);
|
||||
|
||||
result = bus_register(&acpi_bus_type);
|
||||
if (result) {
|
||||
|
||||
@@ -262,7 +262,7 @@ acpi_evaluate_integer(acpi_handle handle,
|
||||
if (!data)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
||||
element = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
element = kmalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL);
|
||||
if (!element)
|
||||
return AE_NO_MEMORY;
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
|
||||
"Node %d Mapped: %8lu kB\n"
|
||||
"Node %d AnonPages: %8lu kB\n"
|
||||
"Node %d PageTables: %8lu kB\n"
|
||||
"Node %d NFS Unstable: %8lu kB\n"
|
||||
"Node %d NFS_Unstable: %8lu kB\n"
|
||||
"Node %d Bounce: %8lu kB\n"
|
||||
"Node %d Slab: %8lu kB\n",
|
||||
nid, K(i.totalram),
|
||||
|
||||
@@ -266,7 +266,7 @@ repeat:
|
||||
goto out;
|
||||
|
||||
if (req->cmd != READ) {
|
||||
printk("GSCD: bad cmd %lu\n", rq_data_dir(req));
|
||||
printk("GSCD: bad cmd %u\n", rq_data_dir(req));
|
||||
end_request(req, 0);
|
||||
goto repeat;
|
||||
}
|
||||
|
||||
@@ -175,6 +175,14 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
||||
}
|
||||
break;
|
||||
|
||||
case R200_EMIT_VAP_CTL:{
|
||||
RING_LOCALS;
|
||||
BEGIN_RING(2);
|
||||
OUT_RING_REG(RADEON_SE_TCL_STATE_FLUSH, 0);
|
||||
ADVANCE_RING();
|
||||
}
|
||||
break;
|
||||
|
||||
case RADEON_EMIT_RB3D_COLORPITCH:
|
||||
case RADEON_EMIT_RE_LINE_PATTERN:
|
||||
case RADEON_EMIT_SE_LINE_WIDTH:
|
||||
@@ -202,7 +210,6 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
||||
case R200_EMIT_TCL_LIGHT_MODEL_CTL_0:
|
||||
case R200_EMIT_TFACTOR_0:
|
||||
case R200_EMIT_VTX_FMT_0:
|
||||
case R200_EMIT_VAP_CTL:
|
||||
case R200_EMIT_MATRIX_SELECT_0:
|
||||
case R200_EMIT_TEX_PROC_CTL_2:
|
||||
case R200_EMIT_TCL_UCP_VERT_BLEND_CTL:
|
||||
|
||||
@@ -142,6 +142,7 @@ typedef struct _moxa_board_conf {
|
||||
|
||||
static moxa_board_conf moxa_boards[MAX_BOARDS];
|
||||
static void __iomem *moxaBaseAddr[MAX_BOARDS];
|
||||
static int loadstat[MAX_BOARDS];
|
||||
|
||||
struct moxa_str {
|
||||
int type;
|
||||
@@ -1688,6 +1689,8 @@ int MoxaDriverPoll(void)
|
||||
if (moxaCard == 0)
|
||||
return (-1);
|
||||
for (card = 0; card < MAX_BOARDS; card++) {
|
||||
if (loadstat[card] == 0)
|
||||
continue;
|
||||
if ((ports = moxa_boards[card].numPorts) == 0)
|
||||
continue;
|
||||
if (readb(moxaIntPend[card]) == 0xff) {
|
||||
@@ -2903,6 +2906,7 @@ static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
|
||||
}
|
||||
break;
|
||||
}
|
||||
loadstat[cardno] = 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -2920,7 +2924,7 @@ static int moxaloadc218(int cardno, void __iomem *baseAddr, int len)
|
||||
len1 = len >> 1;
|
||||
ptr = (ushort *) moxaBuff;
|
||||
for (i = 0; i < len1; i++)
|
||||
usum += *(ptr + i);
|
||||
usum += le16_to_cpu(*(ptr + i));
|
||||
retry = 0;
|
||||
do {
|
||||
len1 = len >> 1;
|
||||
@@ -2992,7 +2996,7 @@ static int moxaloadc320(int cardno, void __iomem *baseAddr, int len, int *numPor
|
||||
wlen = len >> 1;
|
||||
uptr = (ushort *) moxaBuff;
|
||||
for (i = 0; i < wlen; i++)
|
||||
usum += uptr[i];
|
||||
usum += le16_to_cpu(uptr[i]);
|
||||
retry = 0;
|
||||
j = 0;
|
||||
do {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,6 +36,18 @@
|
||||
#define TERMIOS_WAIT 2
|
||||
#define TERMIOS_TERMIO 4
|
||||
|
||||
|
||||
/**
|
||||
* tty_wait_until_sent - wait for I/O to finish
|
||||
* @tty: tty we are waiting for
|
||||
* @timeout: how long we will wait
|
||||
*
|
||||
* Wait for characters pending in a tty driver to hit the wire, or
|
||||
* for a timeout to occur (eg due to flow control)
|
||||
*
|
||||
* Locking: none
|
||||
*/
|
||||
|
||||
void tty_wait_until_sent(struct tty_struct * tty, long timeout)
|
||||
{
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
@@ -94,6 +106,18 @@ static void unset_locked_termios(struct termios *termios,
|
||||
old->c_cc[i] : termios->c_cc[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* change_termios - update termios values
|
||||
* @tty: tty to update
|
||||
* @new_termios: desired new value
|
||||
*
|
||||
* Perform updates to the termios values set on this terminal. There
|
||||
* is a bit of layering violation here with n_tty in terms of the
|
||||
* internal knowledge of this function.
|
||||
*
|
||||
* Locking: termios_sem
|
||||
*/
|
||||
|
||||
static void change_termios(struct tty_struct * tty, struct termios * new_termios)
|
||||
{
|
||||
int canon_change;
|
||||
@@ -155,6 +179,19 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios
|
||||
up(&tty->termios_sem);
|
||||
}
|
||||
|
||||
/**
|
||||
* set_termios - set termios values for a tty
|
||||
* @tty: terminal device
|
||||
* @arg: user data
|
||||
* @opt: option information
|
||||
*
|
||||
* Helper function to prepare termios data and run neccessary other
|
||||
* functions before using change_termios to do the actual changes.
|
||||
*
|
||||
* Locking:
|
||||
* Called functions take ldisc and termios_sem locks
|
||||
*/
|
||||
|
||||
static int set_termios(struct tty_struct * tty, void __user *arg, int opt)
|
||||
{
|
||||
struct termios tmp_termios;
|
||||
@@ -284,6 +321,17 @@ static void set_sgflags(struct termios * termios, int flags)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* set_sgttyb - set legacy terminal values
|
||||
* @tty: tty structure
|
||||
* @sgttyb: pointer to old style terminal structure
|
||||
*
|
||||
* Updates a terminal from the legacy BSD style terminal information
|
||||
* structure.
|
||||
*
|
||||
* Locking: termios_sem
|
||||
*/
|
||||
|
||||
static int set_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
|
||||
{
|
||||
int retval;
|
||||
@@ -369,9 +417,16 @@ static int set_ltchars(struct tty_struct * tty, struct ltchars __user * ltchars)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Send a high priority character to the tty.
|
||||
/**
|
||||
* send_prio_char - send priority character
|
||||
*
|
||||
* Send a high priority character to the tty even if stopped
|
||||
*
|
||||
* Locking: none
|
||||
*
|
||||
* FIXME: overlapping calls with start/stop tty lose state of tty
|
||||
*/
|
||||
|
||||
static void send_prio_char(struct tty_struct *tty, char ch)
|
||||
{
|
||||
int was_stopped = tty->stopped;
|
||||
|
||||
@@ -1011,6 +1011,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
|
||||
return -EPERM;
|
||||
vt_dont_switch = 0;
|
||||
return 0;
|
||||
case VT_GETHIFONTMASK:
|
||||
return put_user(vc->vc_hi_font_mask, (unsigned short __user *)arg);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ config WATCHDOG_NOWAYOUT
|
||||
comment "Watchdog Device Drivers"
|
||||
depends on WATCHDOG
|
||||
|
||||
# Architecture Independant
|
||||
# Architecture Independent
|
||||
|
||||
config SOFT_WATCHDOG
|
||||
tristate "Software watchdog"
|
||||
@@ -127,7 +127,7 @@ config S3C2410_WATCHDOG
|
||||
enabled.
|
||||
|
||||
The driver is limited by the speed of the system's PCLK
|
||||
signal, so with reasonbaly fast systems (PCLK around 50-66MHz)
|
||||
signal, so with reasonably fast systems (PCLK around 50-66MHz)
|
||||
then watchdog intervals of over approximately 20seconds are
|
||||
unavailable.
|
||||
|
||||
@@ -423,7 +423,7 @@ config SBC_EPX_C3_WATCHDOG
|
||||
is no way to know if writing to its IO address will corrupt
|
||||
your system or have any real effect. The only way to be sure
|
||||
that this driver does what you want is to make sure you
|
||||
are runnning it on an EPX-C3 from Winsystems with the watchdog
|
||||
are running it on an EPX-C3 from Winsystems with the watchdog
|
||||
timer at IO address 0x1ee and 0x1ef. It will write to both those
|
||||
IO ports. Basically, the assumption is made that if you compile
|
||||
this driver into your kernel and/or load it as a module, that you
|
||||
@@ -472,7 +472,7 @@ config INDYDOG
|
||||
tristate "Indy/I2 Hardware Watchdog"
|
||||
depends on WATCHDOG && SGI_IP22
|
||||
help
|
||||
Hardwaredriver for the Indy's/I2's watchdog. This is a
|
||||
Hardware driver for the Indy's/I2's watchdog. This is a
|
||||
watchdog timer that will reboot the machine after a 60 second
|
||||
timer expired and no process has written to /dev/watchdog during
|
||||
that time.
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
@@ -64,17 +65,17 @@
|
||||
#define ABIT_UGURU_IN_SENSOR 0
|
||||
#define ABIT_UGURU_TEMP_SENSOR 1
|
||||
#define ABIT_UGURU_NC 2
|
||||
/* Timeouts / Retries, if these turn out to need a lot of fiddling we could
|
||||
convert them to params. */
|
||||
/* 250 was determined by trial and error, 200 works most of the time, but not
|
||||
always. I assume this is cpu-speed independent, since the ISA-bus and not
|
||||
the CPU should be the bottleneck. Note that 250 sometimes is still not
|
||||
enough (only reported on AN7 mb) this is handled by a higher layer. */
|
||||
#define ABIT_UGURU_WAIT_TIMEOUT 250
|
||||
/* In many cases we need to wait for the uGuru to reach a certain status, most
|
||||
of the time it will reach this status within 30 - 90 ISA reads, and thus we
|
||||
can best busy wait. This define gives the total amount of reads to try. */
|
||||
#define ABIT_UGURU_WAIT_TIMEOUT 125
|
||||
/* However sometimes older versions of the uGuru seem to be distracted and they
|
||||
do not respond for a long time. To handle this we sleep before each of the
|
||||
last ABIT_UGURU_WAIT_TIMEOUT_SLEEP tries. */
|
||||
#define ABIT_UGURU_WAIT_TIMEOUT_SLEEP 5
|
||||
/* Normally all expected status in abituguru_ready, are reported after the
|
||||
first read, but sometimes not and we need to poll, 5 polls was not enough
|
||||
50 sofar is. */
|
||||
#define ABIT_UGURU_READY_TIMEOUT 50
|
||||
first read, but sometimes not and we need to poll. */
|
||||
#define ABIT_UGURU_READY_TIMEOUT 5
|
||||
/* Maximum 3 retries on timedout reads/writes, delay 200 ms before retrying */
|
||||
#define ABIT_UGURU_MAX_RETRIES 3
|
||||
#define ABIT_UGURU_RETRY_DELAY (HZ/5)
|
||||
@@ -226,6 +227,10 @@ static int abituguru_wait(struct abituguru_data *data, u8 state)
|
||||
timeout--;
|
||||
if (timeout == 0)
|
||||
return -EBUSY;
|
||||
/* sleep a bit before our last few tries, see the comment on
|
||||
this where ABIT_UGURU_WAIT_TIMEOUT_SLEEP is defined. */
|
||||
if (timeout <= ABIT_UGURU_WAIT_TIMEOUT_SLEEP)
|
||||
msleep(0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -256,6 +261,7 @@ static int abituguru_ready(struct abituguru_data *data)
|
||||
"CMD reg does not hold 0xAC after ready command\n");
|
||||
return -EIO;
|
||||
}
|
||||
msleep(0);
|
||||
}
|
||||
|
||||
/* After this the ABIT_UGURU_DATA port should contain
|
||||
@@ -268,6 +274,7 @@ static int abituguru_ready(struct abituguru_data *data)
|
||||
"state != more input after ready command\n");
|
||||
return -EIO;
|
||||
}
|
||||
msleep(0);
|
||||
}
|
||||
|
||||
data->uguru_ready = 1;
|
||||
@@ -331,7 +338,8 @@ static int abituguru_read(struct abituguru_data *data,
|
||||
/* And read the data */
|
||||
for (i = 0; i < count; i++) {
|
||||
if (abituguru_wait(data, ABIT_UGURU_STATUS_READ)) {
|
||||
ABIT_UGURU_DEBUG(1, "timeout exceeded waiting for "
|
||||
ABIT_UGURU_DEBUG(retries ? 1 : 3,
|
||||
"timeout exceeded waiting for "
|
||||
"read state (bank: %d, sensor: %d)\n",
|
||||
(int)bank_addr, (int)sensor_addr);
|
||||
break;
|
||||
@@ -350,7 +358,9 @@ static int abituguru_read(struct abituguru_data *data,
|
||||
static int abituguru_write(struct abituguru_data *data,
|
||||
u8 bank_addr, u8 sensor_addr, u8 *buf, int count)
|
||||
{
|
||||
int i;
|
||||
/* We use the ready timeout as we have to wait for 0xAC just like the
|
||||
ready function */
|
||||
int i, timeout = ABIT_UGURU_READY_TIMEOUT;
|
||||
|
||||
/* Send the address */
|
||||
i = abituguru_send_address(data, bank_addr, sensor_addr,
|
||||
@@ -370,7 +380,8 @@ static int abituguru_write(struct abituguru_data *data,
|
||||
}
|
||||
|
||||
/* Now we need to wait till the chip is ready to be read again,
|
||||
don't ask why */
|
||||
so that we can read 0xAC as confirmation that our write has
|
||||
succeeded. */
|
||||
if (abituguru_wait(data, ABIT_UGURU_STATUS_READ)) {
|
||||
ABIT_UGURU_DEBUG(1, "timeout exceeded waiting for read state "
|
||||
"after write (bank: %d, sensor: %d)\n", (int)bank_addr,
|
||||
@@ -379,11 +390,15 @@ static int abituguru_write(struct abituguru_data *data,
|
||||
}
|
||||
|
||||
/* Cmd port MUST be read now and should contain 0xAC */
|
||||
if (inb_p(data->addr + ABIT_UGURU_CMD) != 0xAC) {
|
||||
ABIT_UGURU_DEBUG(1, "CMD reg does not hold 0xAC after write "
|
||||
"(bank: %d, sensor: %d)\n", (int)bank_addr,
|
||||
(int)sensor_addr);
|
||||
return -EIO;
|
||||
while (inb_p(data->addr + ABIT_UGURU_CMD) != 0xAC) {
|
||||
timeout--;
|
||||
if (timeout == 0) {
|
||||
ABIT_UGURU_DEBUG(1, "CMD reg does not hold 0xAC after "
|
||||
"write (bank: %d, sensor: %d)\n",
|
||||
(int)bank_addr, (int)sensor_addr);
|
||||
return -EIO;
|
||||
}
|
||||
msleep(0);
|
||||
}
|
||||
|
||||
/* Last put the chip back in ready state */
|
||||
@@ -403,7 +418,7 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data,
|
||||
u8 sensor_addr)
|
||||
{
|
||||
u8 val, buf[3];
|
||||
int ret = ABIT_UGURU_NC;
|
||||
int i, ret = -ENODEV; /* error is the most common used retval :| */
|
||||
|
||||
/* If overriden by the user return the user selected type */
|
||||
if (bank1_types[sensor_addr] >= ABIT_UGURU_IN_SENSOR &&
|
||||
@@ -439,7 +454,7 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data,
|
||||
buf[2] = 250;
|
||||
if (abituguru_write(data, ABIT_UGURU_SENSOR_BANK1 + 2, sensor_addr,
|
||||
buf, 3) != 3)
|
||||
return -ENODEV;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
/* Now we need 20 ms to give the uguru time to read the sensors
|
||||
and raise a voltage alarm */
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
@@ -447,21 +462,16 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data,
|
||||
/* Check for alarm and check the alarm is a volt low alarm. */
|
||||
if (abituguru_read(data, ABIT_UGURU_ALARM_BANK, 0, buf, 3,
|
||||
ABIT_UGURU_MAX_RETRIES) != 3)
|
||||
return -ENODEV;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
if (buf[sensor_addr/8] & (0x01 << (sensor_addr % 8))) {
|
||||
if (abituguru_read(data, ABIT_UGURU_SENSOR_BANK1 + 1,
|
||||
sensor_addr, buf, 3,
|
||||
ABIT_UGURU_MAX_RETRIES) != 3)
|
||||
return -ENODEV;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
if (buf[0] & ABIT_UGURU_VOLT_LOW_ALARM_FLAG) {
|
||||
/* Restore original settings */
|
||||
if (abituguru_write(data, ABIT_UGURU_SENSOR_BANK1 + 2,
|
||||
sensor_addr,
|
||||
data->bank1_settings[sensor_addr],
|
||||
3) != 3)
|
||||
return -ENODEV;
|
||||
ABIT_UGURU_DEBUG(2, " found volt sensor\n");
|
||||
return ABIT_UGURU_IN_SENSOR;
|
||||
ret = ABIT_UGURU_IN_SENSOR;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
} else
|
||||
ABIT_UGURU_DEBUG(2, " alarm raised during volt "
|
||||
"sensor test, but volt low flag not set\n");
|
||||
@@ -477,7 +487,7 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data,
|
||||
buf[2] = 10;
|
||||
if (abituguru_write(data, ABIT_UGURU_SENSOR_BANK1 + 2, sensor_addr,
|
||||
buf, 3) != 3)
|
||||
return -ENODEV;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
/* Now we need 50 ms to give the uguru time to read the sensors
|
||||
and raise a temp alarm */
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
@@ -485,15 +495,16 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data,
|
||||
/* Check for alarm and check the alarm is a temp high alarm. */
|
||||
if (abituguru_read(data, ABIT_UGURU_ALARM_BANK, 0, buf, 3,
|
||||
ABIT_UGURU_MAX_RETRIES) != 3)
|
||||
return -ENODEV;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
if (buf[sensor_addr/8] & (0x01 << (sensor_addr % 8))) {
|
||||
if (abituguru_read(data, ABIT_UGURU_SENSOR_BANK1 + 1,
|
||||
sensor_addr, buf, 3,
|
||||
ABIT_UGURU_MAX_RETRIES) != 3)
|
||||
return -ENODEV;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
if (buf[0] & ABIT_UGURU_TEMP_HIGH_ALARM_FLAG) {
|
||||
ret = ABIT_UGURU_TEMP_SENSOR;
|
||||
ABIT_UGURU_DEBUG(2, " found temp sensor\n");
|
||||
ret = ABIT_UGURU_TEMP_SENSOR;
|
||||
goto abituguru_detect_bank1_sensor_type_exit;
|
||||
} else
|
||||
ABIT_UGURU_DEBUG(2, " alarm raised during temp "
|
||||
"sensor test, but temp high flag not set\n");
|
||||
@@ -501,11 +512,23 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data,
|
||||
ABIT_UGURU_DEBUG(2, " alarm not raised during temp sensor "
|
||||
"test\n");
|
||||
|
||||
/* Restore original settings */
|
||||
if (abituguru_write(data, ABIT_UGURU_SENSOR_BANK1 + 2, sensor_addr,
|
||||
data->bank1_settings[sensor_addr], 3) != 3)
|
||||
ret = ABIT_UGURU_NC;
|
||||
abituguru_detect_bank1_sensor_type_exit:
|
||||
/* Restore original settings, failing here is really BAD, it has been
|
||||
reported that some BIOS-es hang when entering the uGuru menu with
|
||||
invalid settings present in the uGuru, so we try this 3 times. */
|
||||
for (i = 0; i < 3; i++)
|
||||
if (abituguru_write(data, ABIT_UGURU_SENSOR_BANK1 + 2,
|
||||
sensor_addr, data->bank1_settings[sensor_addr],
|
||||
3) == 3)
|
||||
break;
|
||||
if (i == 3) {
|
||||
printk(KERN_ERR ABIT_UGURU_NAME
|
||||
": Fatal error could not restore original settings. "
|
||||
"This should never happen please report this to the "
|
||||
"abituguru maintainer (see MAINTAINERS)\n");
|
||||
return -ENODEV;
|
||||
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1305,7 +1328,7 @@ static struct abituguru_data *abituguru_update_device(struct device *dev)
|
||||
data->update_timeouts = 0;
|
||||
LEAVE_UPDATE:
|
||||
/* handle timeout condition */
|
||||
if (err == -EBUSY) {
|
||||
if (!success && (err == -EBUSY || err >= 0)) {
|
||||
/* No overflow please */
|
||||
if (data->update_timeouts < 255u)
|
||||
data->update_timeouts++;
|
||||
|
||||
@@ -43,13 +43,12 @@
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#define DRIVER_VERSION "2 May 2005"
|
||||
#define DRIVER_NAME (tps65010_driver.name)
|
||||
#define DRIVER_NAME (tps65010_driver.driver.name)
|
||||
|
||||
MODULE_DESCRIPTION("TPS6501x Power Management Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static unsigned short normal_i2c[] = { 0x48, /* 0x49, */ I2C_CLIENT_END };
|
||||
static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
|
||||
|
||||
I2C_CLIENT_INSMOD;
|
||||
|
||||
@@ -100,7 +99,7 @@ struct tps65010 {
|
||||
/* not currently tracking GPIO state */
|
||||
};
|
||||
|
||||
#define POWER_POLL_DELAY msecs_to_jiffies(800)
|
||||
#define POWER_POLL_DELAY msecs_to_jiffies(5000)
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@@ -520,8 +519,11 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind)
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
/* the IRQ is active low, but many gpio lines can't support that
|
||||
* so this driver can use falling-edge triggers instead.
|
||||
*/
|
||||
irqflags = IRQF_SAMPLE_RANDOM;
|
||||
#ifdef CONFIG_ARM
|
||||
irqflags = IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_LOW;
|
||||
if (machine_is_omap_h2()) {
|
||||
tps->model = TPS65010;
|
||||
omap_cfg_reg(W4_GPIO58);
|
||||
@@ -543,8 +545,6 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind)
|
||||
|
||||
// FIXME set up this board's IRQ ...
|
||||
}
|
||||
#else
|
||||
irqflags = IRQF_SAMPLE_RANDOM;
|
||||
#endif
|
||||
|
||||
if (tps->irq > 0) {
|
||||
|
||||
@@ -180,6 +180,36 @@ static ide_pci_device_t generic_chipsets[] __devinitdata = {
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
},{ /* 15 */
|
||||
.name = "JMB361",
|
||||
.init_hwif = init_hwif_generic,
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
},{ /* 16 */
|
||||
.name = "JMB363",
|
||||
.init_hwif = init_hwif_generic,
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
},{ /* 17 */
|
||||
.name = "JMB365",
|
||||
.init_hwif = init_hwif_generic,
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
},{ /* 18 */
|
||||
.name = "JMB366",
|
||||
.init_hwif = init_hwif_generic,
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
},{ /* 19 */
|
||||
.name = "JMB368",
|
||||
.init_hwif = init_hwif_generic,
|
||||
.channels = 2,
|
||||
.autodma = AUTODMA,
|
||||
.bootable = OFF_BOARD,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*
|
||||
* vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b,
|
||||
* vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a,
|
||||
* vt8235, vt8237
|
||||
* vt8235, vt8237, vt8237a
|
||||
*
|
||||
* Copyright (c) 2000-2002 Vojtech Pavlik
|
||||
*
|
||||
@@ -81,6 +81,7 @@ static struct via_isa_bridge {
|
||||
{ "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||
{ "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||
{ "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||
{ "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||
{ "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||
{ "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||
{ "vt8233c", PCI_DEVICE_ID_VIA_8233C_0, 0x00, 0x2f, VIA_UDMA_100 },
|
||||
|
||||
@@ -3552,6 +3552,8 @@ static int ohci1394_pci_resume (struct pci_dev *pdev)
|
||||
|
||||
static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state)
|
||||
{
|
||||
pci_save_state(pdev);
|
||||
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
if (machine_is(powermac)) {
|
||||
struct device_node *of_node;
|
||||
@@ -3563,8 +3565,6 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state)
|
||||
}
|
||||
#endif
|
||||
|
||||
pci_save_state(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -301,7 +301,8 @@ static void ib_cache_event(struct ib_event_handler *handler,
|
||||
event->event == IB_EVENT_PORT_ACTIVE ||
|
||||
event->event == IB_EVENT_LID_CHANGE ||
|
||||
event->event == IB_EVENT_PKEY_CHANGE ||
|
||||
event->event == IB_EVENT_SM_CHANGE) {
|
||||
event->event == IB_EVENT_SM_CHANGE ||
|
||||
event->event == IB_EVENT_CLIENT_REREGISTER) {
|
||||
work = kmalloc(sizeof *work, GFP_ATOMIC);
|
||||
if (work) {
|
||||
INIT_WORK(&work->work, ib_cache_task, work);
|
||||
|
||||
@@ -405,7 +405,8 @@ static void ib_sa_event(struct ib_event_handler *handler, struct ib_event *event
|
||||
event->event == IB_EVENT_PORT_ACTIVE ||
|
||||
event->event == IB_EVENT_LID_CHANGE ||
|
||||
event->event == IB_EVENT_PKEY_CHANGE ||
|
||||
event->event == IB_EVENT_SM_CHANGE) {
|
||||
event->event == IB_EVENT_SM_CHANGE ||
|
||||
event->event == IB_EVENT_CLIENT_REREGISTER) {
|
||||
struct ib_sa_device *sa_dev;
|
||||
sa_dev = container_of(handler, typeof(*sa_dev), event_handler);
|
||||
|
||||
|
||||
@@ -967,12 +967,12 @@ static struct {
|
||||
} mthca_hca_table[] = {
|
||||
[TAVOR] = { .latest_fw = MTHCA_FW_VER(3, 4, 0),
|
||||
.flags = 0 },
|
||||
[ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 400),
|
||||
[ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 600),
|
||||
.flags = MTHCA_FLAG_PCIE },
|
||||
[ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 0),
|
||||
[ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 400),
|
||||
.flags = MTHCA_FLAG_MEMFREE |
|
||||
MTHCA_FLAG_PCIE },
|
||||
[SINAI] = { .latest_fw = MTHCA_FW_VER(1, 0, 800),
|
||||
[SINAI] = { .latest_fw = MTHCA_FW_VER(1, 1, 0),
|
||||
.flags = MTHCA_FLAG_MEMFREE |
|
||||
MTHCA_FLAG_PCIE |
|
||||
MTHCA_FLAG_SINAI_OPT }
|
||||
|
||||
@@ -1287,11 +1287,7 @@ int mthca_register_device(struct mthca_dev *dev)
|
||||
(1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
|
||||
(1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
|
||||
(1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) |
|
||||
(1ull << IB_USER_VERBS_CMD_DETACH_MCAST) |
|
||||
(1ull << IB_USER_VERBS_CMD_CREATE_SRQ) |
|
||||
(1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) |
|
||||
(1ull << IB_USER_VERBS_CMD_QUERY_SRQ) |
|
||||
(1ull << IB_USER_VERBS_CMD_DESTROY_SRQ);
|
||||
(1ull << IB_USER_VERBS_CMD_DETACH_MCAST);
|
||||
dev->ib_dev.node_type = IB_NODE_CA;
|
||||
dev->ib_dev.phys_port_cnt = dev->limits.num_ports;
|
||||
dev->ib_dev.dma_device = &dev->pdev->dev;
|
||||
@@ -1316,6 +1312,11 @@ int mthca_register_device(struct mthca_dev *dev)
|
||||
dev->ib_dev.modify_srq = mthca_modify_srq;
|
||||
dev->ib_dev.query_srq = mthca_query_srq;
|
||||
dev->ib_dev.destroy_srq = mthca_destroy_srq;
|
||||
dev->ib_dev.uverbs_cmd_mask |=
|
||||
(1ull << IB_USER_VERBS_CMD_CREATE_SRQ) |
|
||||
(1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) |
|
||||
(1ull << IB_USER_VERBS_CMD_QUERY_SRQ) |
|
||||
(1ull << IB_USER_VERBS_CMD_DESTROY_SRQ);
|
||||
|
||||
if (mthca_is_memfree(dev))
|
||||
dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv;
|
||||
|
||||
@@ -136,8 +136,8 @@ struct mthca_ah {
|
||||
* We have one global lock that protects dev->cq/qp_table. Each
|
||||
* struct mthca_cq/qp also has its own lock. An individual qp lock
|
||||
* may be taken inside of an individual cq lock. Both cqs attached to
|
||||
* a qp may be locked, with the send cq locked first. No other
|
||||
* nesting should be done.
|
||||
* a qp may be locked, with the cq with the lower cqn locked first.
|
||||
* No other nesting should be done.
|
||||
*
|
||||
* Each struct mthca_cq/qp also has an ref count, protected by the
|
||||
* corresponding table lock. The pointer from the cq/qp_table to the
|
||||
|
||||
@@ -99,6 +99,10 @@ enum {
|
||||
MTHCA_QP_BIT_RSC = 1 << 3
|
||||
};
|
||||
|
||||
enum {
|
||||
MTHCA_SEND_DOORBELL_FENCE = 1 << 5
|
||||
};
|
||||
|
||||
struct mthca_qp_path {
|
||||
__be32 port_pkey;
|
||||
u8 rnr_retry;
|
||||
@@ -1259,6 +1263,32 @@ int mthca_alloc_qp(struct mthca_dev *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mthca_lock_cqs(struct mthca_cq *send_cq, struct mthca_cq *recv_cq)
|
||||
{
|
||||
if (send_cq == recv_cq)
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
else if (send_cq->cqn < recv_cq->cqn) {
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
|
||||
} else {
|
||||
spin_lock_irq(&recv_cq->lock);
|
||||
spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
|
||||
}
|
||||
}
|
||||
|
||||
static void mthca_unlock_cqs(struct mthca_cq *send_cq, struct mthca_cq *recv_cq)
|
||||
{
|
||||
if (send_cq == recv_cq)
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
else if (send_cq->cqn < recv_cq->cqn) {
|
||||
spin_unlock(&recv_cq->lock);
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
} else {
|
||||
spin_unlock(&send_cq->lock);
|
||||
spin_unlock_irq(&recv_cq->lock);
|
||||
}
|
||||
}
|
||||
|
||||
int mthca_alloc_sqp(struct mthca_dev *dev,
|
||||
struct mthca_pd *pd,
|
||||
struct mthca_cq *send_cq,
|
||||
@@ -1311,17 +1341,13 @@ int mthca_alloc_sqp(struct mthca_dev *dev,
|
||||
* Lock CQs here, so that CQ polling code can do QP lookup
|
||||
* without taking a lock.
|
||||
*/
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
if (send_cq != recv_cq)
|
||||
spin_lock(&recv_cq->lock);
|
||||
mthca_lock_cqs(send_cq, recv_cq);
|
||||
|
||||
spin_lock(&dev->qp_table.lock);
|
||||
mthca_array_clear(&dev->qp_table.qp, mqpn);
|
||||
spin_unlock(&dev->qp_table.lock);
|
||||
|
||||
if (send_cq != recv_cq)
|
||||
spin_unlock(&recv_cq->lock);
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
mthca_unlock_cqs(send_cq, recv_cq);
|
||||
|
||||
err_out:
|
||||
dma_free_coherent(&dev->pdev->dev, sqp->header_buf_size,
|
||||
@@ -1355,9 +1381,7 @@ void mthca_free_qp(struct mthca_dev *dev,
|
||||
* Lock CQs here, so that CQ polling code can do QP lookup
|
||||
* without taking a lock.
|
||||
*/
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
if (send_cq != recv_cq)
|
||||
spin_lock(&recv_cq->lock);
|
||||
mthca_lock_cqs(send_cq, recv_cq);
|
||||
|
||||
spin_lock(&dev->qp_table.lock);
|
||||
mthca_array_clear(&dev->qp_table.qp,
|
||||
@@ -1365,9 +1389,7 @@ void mthca_free_qp(struct mthca_dev *dev,
|
||||
--qp->refcount;
|
||||
spin_unlock(&dev->qp_table.lock);
|
||||
|
||||
if (send_cq != recv_cq)
|
||||
spin_unlock(&recv_cq->lock);
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
mthca_unlock_cqs(send_cq, recv_cq);
|
||||
|
||||
wait_event(qp->wait, !get_qp_refcount(dev, qp));
|
||||
|
||||
@@ -1502,7 +1524,7 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
||||
int i;
|
||||
int size;
|
||||
int size0 = 0;
|
||||
u32 f0 = 0;
|
||||
u32 f0;
|
||||
int ind;
|
||||
u8 op0 = 0;
|
||||
|
||||
@@ -1686,6 +1708,8 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
||||
if (!size0) {
|
||||
size0 = size;
|
||||
op0 = mthca_opcode[wr->opcode];
|
||||
f0 = wr->send_flags & IB_SEND_FENCE ?
|
||||
MTHCA_SEND_DOORBELL_FENCE : 0;
|
||||
}
|
||||
|
||||
++ind;
|
||||
@@ -1843,7 +1867,7 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
||||
int i;
|
||||
int size;
|
||||
int size0 = 0;
|
||||
u32 f0 = 0;
|
||||
u32 f0;
|
||||
int ind;
|
||||
u8 op0 = 0;
|
||||
|
||||
@@ -2051,6 +2075,8 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
||||
if (!size0) {
|
||||
size0 = size;
|
||||
op0 = mthca_opcode[wr->opcode];
|
||||
f0 = wr->send_flags & IB_SEND_FENCE ?
|
||||
MTHCA_SEND_DOORBELL_FENCE : 0;
|
||||
}
|
||||
|
||||
++ind;
|
||||
|
||||
@@ -378,21 +378,6 @@ iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn)
|
||||
return iser_conn_set_full_featured_mode(conn);
|
||||
}
|
||||
|
||||
static void
|
||||
iscsi_iser_conn_terminate(struct iscsi_conn *conn)
|
||||
{
|
||||
struct iscsi_iser_conn *iser_conn = conn->dd_data;
|
||||
struct iser_conn *ib_conn = iser_conn->ib_conn;
|
||||
|
||||
BUG_ON(!ib_conn);
|
||||
/* starts conn teardown process, waits until all previously *
|
||||
* posted buffers get flushed, deallocates all conn resources */
|
||||
iser_conn_terminate(ib_conn);
|
||||
iser_conn->ib_conn = NULL;
|
||||
conn->recv_lock = NULL;
|
||||
}
|
||||
|
||||
|
||||
static struct iscsi_transport iscsi_iser_transport;
|
||||
|
||||
static struct iscsi_cls_session *
|
||||
@@ -555,13 +540,13 @@ iscsi_iser_ep_poll(__u64 ep_handle, int timeout_ms)
|
||||
static void
|
||||
iscsi_iser_ep_disconnect(__u64 ep_handle)
|
||||
{
|
||||
struct iser_conn *ib_conn = iscsi_iser_ib_conn_lookup(ep_handle);
|
||||
struct iser_conn *ib_conn;
|
||||
|
||||
ib_conn = iscsi_iser_ib_conn_lookup(ep_handle);
|
||||
if (!ib_conn)
|
||||
return;
|
||||
|
||||
iser_err("ib conn %p state %d\n",ib_conn, ib_conn->state);
|
||||
|
||||
iser_conn_terminate(ib_conn);
|
||||
}
|
||||
|
||||
@@ -614,9 +599,6 @@ static struct iscsi_transport iscsi_iser_transport = {
|
||||
.get_session_param = iscsi_session_get_param,
|
||||
.start_conn = iscsi_iser_conn_start,
|
||||
.stop_conn = iscsi_conn_stop,
|
||||
/* these are called as part of conn recovery */
|
||||
.suspend_conn_recv = NULL, /* FIXME is/how this relvant to iser? */
|
||||
.terminate_conn = iscsi_iser_conn_terminate,
|
||||
/* IO */
|
||||
.send_pdu = iscsi_conn_send_pdu,
|
||||
.get_stats = iscsi_iser_conn_get_stats,
|
||||
|
||||
@@ -498,7 +498,7 @@ static int atkbd_set_repeat_rate(struct atkbd *atkbd)
|
||||
i++;
|
||||
dev->rep[REP_PERIOD] = period[i];
|
||||
|
||||
while (j < ARRAY_SIZE(period) - 1 && delay[j] < dev->rep[REP_DELAY])
|
||||
while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY])
|
||||
j++;
|
||||
dev->rep[REP_DELAY] = delay[j];
|
||||
|
||||
|
||||
@@ -259,11 +259,11 @@ static int __init dmi_matched(struct dmi_system_id *dmi)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct key_entry keymap_empty[] __initdata = {
|
||||
static struct key_entry keymap_empty[] = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_fs_amilo_pro_v2000[] __initdata = {
|
||||
static struct key_entry keymap_fs_amilo_pro_v2000[] = {
|
||||
{ KE_KEY, 0x01, KEY_HELP },
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
@@ -273,7 +273,7 @@ static struct key_entry keymap_fs_amilo_pro_v2000[] __initdata = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_fujitsu_n3510[] __initdata = {
|
||||
static struct key_entry keymap_fujitsu_n3510[] = {
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
{ KE_KEY, 0x36, KEY_WWW },
|
||||
@@ -285,7 +285,7 @@ static struct key_entry keymap_fujitsu_n3510[] __initdata = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_wistron_ms2111[] __initdata = {
|
||||
static struct key_entry keymap_wistron_ms2111[] = {
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
{ KE_KEY, 0x13, KEY_PROG3 },
|
||||
@@ -294,7 +294,7 @@ static struct key_entry keymap_wistron_ms2111[] __initdata = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_wistron_ms2141[] __initdata = {
|
||||
static struct key_entry keymap_wistron_ms2141[] = {
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
{ KE_WIFI, 0x30, 0 },
|
||||
@@ -307,7 +307,7 @@ static struct key_entry keymap_wistron_ms2141[] __initdata = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_acer_aspire_1500[] __initdata = {
|
||||
static struct key_entry keymap_acer_aspire_1500[] = {
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
{ KE_WIFI, 0x30, 0 },
|
||||
@@ -317,7 +317,7 @@ static struct key_entry keymap_acer_aspire_1500[] __initdata = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_acer_travelmate_240[] __initdata = {
|
||||
static struct key_entry keymap_acer_travelmate_240[] = {
|
||||
{ KE_KEY, 0x31, KEY_MAIL },
|
||||
{ KE_KEY, 0x36, KEY_WWW },
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
@@ -327,7 +327,7 @@ static struct key_entry keymap_acer_travelmate_240[] __initdata = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_aopen_1559as[] __initdata = {
|
||||
static struct key_entry keymap_aopen_1559as[] = {
|
||||
{ KE_KEY, 0x01, KEY_HELP },
|
||||
{ KE_KEY, 0x06, KEY_PROG3 },
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
|
||||
@@ -485,13 +485,6 @@ static int im_explorer_detect(struct psmouse *psmouse, int set_properties)
|
||||
param[0] = 40;
|
||||
ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
|
||||
|
||||
param[0] = 200;
|
||||
ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
|
||||
param[0] = 200;
|
||||
ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
|
||||
param[0] = 60;
|
||||
ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
|
||||
|
||||
if (set_properties) {
|
||||
set_bit(BTN_MIDDLE, psmouse->dev->keybit);
|
||||
set_bit(REL_WHEEL, psmouse->dev->relbit);
|
||||
|
||||
@@ -710,6 +710,8 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
m->ti = ti;
|
||||
|
||||
r = parse_features(&as, m, ti);
|
||||
if (r)
|
||||
goto bad;
|
||||
@@ -751,7 +753,6 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc,
|
||||
}
|
||||
|
||||
ti->private = m;
|
||||
m->ti = ti;
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -255,7 +255,9 @@ static struct region *__rh_alloc(struct region_hash *rh, region_t region)
|
||||
struct region *reg, *nreg;
|
||||
|
||||
read_unlock(&rh->hash_lock);
|
||||
nreg = mempool_alloc(rh->region_pool, GFP_NOIO);
|
||||
nreg = mempool_alloc(rh->region_pool, GFP_ATOMIC);
|
||||
if (unlikely(!nreg))
|
||||
nreg = kmalloc(sizeof(struct region), GFP_NOIO);
|
||||
nreg->state = rh->log->type->in_sync(rh->log, region, 1) ?
|
||||
RH_CLEAN : RH_NOSYNC;
|
||||
nreg->rh = rh;
|
||||
|
||||
@@ -1597,6 +1597,19 @@ void md_update_sb(mddev_t * mddev)
|
||||
|
||||
repeat:
|
||||
spin_lock_irq(&mddev->write_lock);
|
||||
|
||||
if (mddev->degraded && mddev->sb_dirty == 3)
|
||||
/* If the array is degraded, then skipping spares is both
|
||||
* dangerous and fairly pointless.
|
||||
* Dangerous because a device that was removed from the array
|
||||
* might have a event_count that still looks up-to-date,
|
||||
* so it can be re-added without a resync.
|
||||
* Pointless because if there are any spares to skip,
|
||||
* then a recovery will happen and soon that array won't
|
||||
* be degraded any more and the spare can go back to sleep then.
|
||||
*/
|
||||
mddev->sb_dirty = 1;
|
||||
|
||||
sync_req = mddev->in_sync;
|
||||
mddev->utime = get_seconds();
|
||||
if (mddev->sb_dirty == 3)
|
||||
|
||||
@@ -1625,15 +1625,16 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* before building a request, check if we can skip these blocks..
|
||||
* This call the bitmap_start_sync doesn't actually record anything
|
||||
*/
|
||||
if (mddev->bitmap == NULL &&
|
||||
mddev->recovery_cp == MaxSector &&
|
||||
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
|
||||
conf->fullsync == 0) {
|
||||
*skipped = 1;
|
||||
return max_sector - sector_nr;
|
||||
}
|
||||
/* before building a request, check if we can skip these blocks..
|
||||
* This call the bitmap_start_sync doesn't actually record anything
|
||||
*/
|
||||
if (!bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 1) &&
|
||||
!conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
|
||||
/* We can skip this block, and probably several more */
|
||||
|
||||
@@ -393,7 +393,7 @@ static int dst_set_bandwidth(struct dst_state *state, fe_bandwidth_t bandwidth)
|
||||
state->bandwidth = bandwidth;
|
||||
|
||||
if (state->dst_type != DST_TYPE_IS_TERR)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (bandwidth) {
|
||||
case BANDWIDTH_6_MHZ:
|
||||
@@ -462,7 +462,7 @@ static int dst_set_symbolrate(struct dst_state *state, u32 srate)
|
||||
|
||||
state->symbol_rate = srate;
|
||||
if (state->dst_type == DST_TYPE_IS_TERR) {
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
dprintk(verbose, DST_INFO, 1, "set symrate %u", srate);
|
||||
srate /= 1000;
|
||||
@@ -504,7 +504,7 @@ static int dst_set_symbolrate(struct dst_state *state, u32 srate)
|
||||
static int dst_set_modulation(struct dst_state *state, fe_modulation_t modulation)
|
||||
{
|
||||
if (state->dst_type != DST_TYPE_IS_CABLE)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
state->modulation = modulation;
|
||||
switch (modulation) {
|
||||
@@ -1234,7 +1234,7 @@ int dst_command(struct dst_state *state, u8 *data, u8 len)
|
||||
goto error;
|
||||
}
|
||||
if (write_dst(state, data, len)) {
|
||||
dprintk(verbose, DST_INFO, 1, "Tring to recover.. ");
|
||||
dprintk(verbose, DST_INFO, 1, "Trying to recover.. ");
|
||||
if ((dst_error_recovery(state)) < 0) {
|
||||
dprintk(verbose, DST_ERROR, 1, "Recovery Failed.");
|
||||
goto error;
|
||||
@@ -1328,15 +1328,13 @@ static int dst_tone_power_cmd(struct dst_state *state)
|
||||
{
|
||||
u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 };
|
||||
|
||||
if (state->dst_type == DST_TYPE_IS_TERR)
|
||||
return 0;
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return -EOPNOTSUPP;
|
||||
paket[4] = state->tx_tuna[4];
|
||||
paket[2] = state->tx_tuna[2];
|
||||
paket[3] = state->tx_tuna[3];
|
||||
paket[7] = dst_check_sum (paket, 7);
|
||||
dst_command(state, paket, 8);
|
||||
|
||||
return 0;
|
||||
return dst_command(state, paket, 8);
|
||||
}
|
||||
|
||||
static int dst_get_tuna(struct dst_state *state)
|
||||
@@ -1465,7 +1463,7 @@ static int dst_set_diseqc(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd
|
||||
u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
|
||||
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
if (cmd->msg_len > 0 && cmd->msg_len < 5)
|
||||
memcpy(&paket[3], cmd->msg, cmd->msg_len);
|
||||
else if (cmd->msg_len == 5 && state->dst_hw_cap & DST_TYPE_HAS_DISEQC5)
|
||||
@@ -1473,18 +1471,17 @@ static int dst_set_diseqc(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd
|
||||
else
|
||||
return -EINVAL;
|
||||
paket[7] = dst_check_sum(&paket[0], 7);
|
||||
dst_command(state, paket, 8);
|
||||
return 0;
|
||||
return dst_command(state, paket, 8);
|
||||
}
|
||||
|
||||
static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
||||
{
|
||||
int need_cmd;
|
||||
int need_cmd, retval = 0;
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
|
||||
state->voltage = voltage;
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
need_cmd = 0;
|
||||
|
||||
@@ -1506,9 +1503,9 @@ static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
||||
}
|
||||
|
||||
if (need_cmd)
|
||||
dst_tone_power_cmd(state);
|
||||
retval = dst_tone_power_cmd(state);
|
||||
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
|
||||
@@ -1517,7 +1514,7 @@ static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
|
||||
|
||||
state->tone = tone;
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (tone) {
|
||||
case SEC_TONE_OFF:
|
||||
@@ -1533,9 +1530,7 @@ static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_tone_power_cmd(state);
|
||||
|
||||
return 0;
|
||||
return dst_tone_power_cmd(state);
|
||||
}
|
||||
|
||||
static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
|
||||
@@ -1543,7 +1538,7 @@ static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
state->minicmd = minicmd;
|
||||
switch (minicmd) {
|
||||
case SEC_MINI_A:
|
||||
@@ -1553,9 +1548,7 @@ static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
|
||||
state->tx_tuna[3] = 0xff;
|
||||
break;
|
||||
}
|
||||
dst_tone_power_cmd(state);
|
||||
|
||||
return 0;
|
||||
return dst_tone_power_cmd(state);
|
||||
}
|
||||
|
||||
|
||||
@@ -1608,28 +1601,31 @@ static int dst_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
||||
{
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
|
||||
dst_get_signal(state);
|
||||
int retval = dst_get_signal(state);
|
||||
*strength = state->decode_strength;
|
||||
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int dst_read_snr(struct dvb_frontend *fe, u16 *snr)
|
||||
{
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
|
||||
dst_get_signal(state);
|
||||
int retval = dst_get_signal(state);
|
||||
*snr = state->decode_snr;
|
||||
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
|
||||
{
|
||||
int retval = -EINVAL;
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
|
||||
if (p != NULL) {
|
||||
dst_set_freq(state, p->frequency);
|
||||
retval = dst_set_freq(state, p->frequency);
|
||||
if(retval != 0)
|
||||
return retval;
|
||||
dprintk(verbose, DST_DEBUG, 1, "Set Frequency=[%d]", p->frequency);
|
||||
|
||||
if (state->dst_type == DST_TYPE_IS_SAT) {
|
||||
@@ -1647,10 +1643,10 @@ static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_paramet
|
||||
dst_set_symbolrate(state, p->u.qam.symbol_rate);
|
||||
dst_set_modulation(state, p->u.qam.modulation);
|
||||
}
|
||||
dst_write_tuna(fe);
|
||||
retval = dst_write_tuna(fe);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int dst_tune_frontend(struct dvb_frontend* fe,
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# Makefile for the kernel DVB device drivers.
|
||||
#
|
||||
|
||||
dvb-core-objs = dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \
|
||||
dvb_ca_en50221.o dvb_frontend.o \
|
||||
dvb_net.o dvb_ringbuffer.o dvb_math.o
|
||||
dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \
|
||||
dvb_ca_en50221.o dvb_frontend.o \
|
||||
dvb_net.o dvb_ringbuffer.o dvb_math.o
|
||||
|
||||
obj-$(CONFIG_DVB_CORE) += dvb-core.o
|
||||
|
||||
@@ -350,5 +350,15 @@ config RADIO_ZOLTRIX_PORT
|
||||
help
|
||||
Enter the I/O port of your Zoltrix radio card.
|
||||
|
||||
endmenu
|
||||
config USB_DSBR
|
||||
tristate "D-Link USB FM radio support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
---help---
|
||||
Say Y here if you want to connect this type of radio to your
|
||||
computer's USB port. Note that the audio is not digital, and
|
||||
you must connect the line out connector to a sound card or a
|
||||
set of speakers.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dsbr100.
|
||||
endmenu
|
||||
|
||||
@@ -20,5 +20,6 @@ obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o
|
||||
obj-$(CONFIG_RADIO_GEMTEK_PCI) += radio-gemtek-pci.o
|
||||
obj-$(CONFIG_RADIO_TRUST) += radio-trust.o
|
||||
obj-$(CONFIG_RADIO_MAESTRO) += radio-maestro.o
|
||||
obj-$(CONFIG_USB_DSBR) += dsbr100.o
|
||||
|
||||
EXTRA_CFLAGS += -Isound
|
||||
|
||||
@@ -449,18 +449,6 @@ source "drivers/media/video/pvrusb2/Kconfig"
|
||||
|
||||
source "drivers/media/video/em28xx/Kconfig"
|
||||
|
||||
config USB_DSBR
|
||||
tristate "D-Link USB FM radio support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
---help---
|
||||
Say Y here if you want to connect this type of radio to your
|
||||
computer's USB port. Note that the audio is not digital, and
|
||||
you must connect the line out connector to a sound card or a
|
||||
set of speakers.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dsbr100.
|
||||
|
||||
source "drivers/media/video/usbvideo/Kconfig"
|
||||
|
||||
source "drivers/media/video/et61x251/Kconfig"
|
||||
|
||||
@@ -77,7 +77,6 @@ obj-$(CONFIG_VIDEO_UPD64083) += upd64083.o
|
||||
obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o
|
||||
|
||||
obj-$(CONFIG_USB_DABUSB) += dabusb.o
|
||||
obj-$(CONFIG_USB_DSBR) += dsbr100.o
|
||||
obj-$(CONFIG_USB_OV511) += ov511.o
|
||||
obj-$(CONFIG_USB_SE401) += se401.o
|
||||
obj-$(CONFIG_USB_STV680) += stv680.o
|
||||
@@ -91,6 +90,7 @@ obj-$(CONFIG_USB_ZC0301) += zc0301/
|
||||
obj-$(CONFIG_USB_IBMCAM) += usbvideo/
|
||||
obj-$(CONFIG_USB_KONICAWC) += usbvideo/
|
||||
obj-$(CONFIG_USB_VICAM) += usbvideo/
|
||||
obj-$(CONFIG_USB_QUICKCAM_MESSENGER) += usbvideo/
|
||||
|
||||
obj-$(CONFIG_VIDEO_VIVI) += vivi.o
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
struct video_tuner32 {
|
||||
compat_int_t tuner;
|
||||
char name[32];
|
||||
@@ -107,6 +107,7 @@ struct video_window32 {
|
||||
compat_caddr_t clips;
|
||||
compat_int_t clipcount;
|
||||
};
|
||||
#endif
|
||||
|
||||
static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
@@ -124,6 +125,7 @@ static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* You get back everything except the clips... */
|
||||
static int put_video_window32(struct video_window *kp, struct video_window32 __user *up)
|
||||
{
|
||||
@@ -138,6 +140,7 @@ static int put_video_window32(struct video_window *kp, struct video_window32 __u
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct v4l2_clip32
|
||||
{
|
||||
@@ -490,6 +493,7 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
struct video_code32
|
||||
{
|
||||
char loadwhat[16]; /* name or tag of file being passed */
|
||||
@@ -517,6 +521,8 @@ static inline int microcode32(struct video_code *kp, struct video_code32 __user
|
||||
#define VIDIOCSFREQ32 _IOW('v',15, u32)
|
||||
#define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32)
|
||||
|
||||
#endif
|
||||
|
||||
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
||||
#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4)
|
||||
#define VIDIOC_G_FMT32 _IOWR ('V', 4, struct v4l2_format32)
|
||||
@@ -537,6 +543,7 @@ static inline int microcode32(struct video_code *kp, struct video_code32 __user
|
||||
#define VIDIOC_S_INPUT32 _IOWR ('V', 39, compat_int_t)
|
||||
#define VIDIOC_TRY_FMT32 _IOWR ('V', 64, struct v4l2_format32)
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
enum {
|
||||
MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip)
|
||||
};
|
||||
@@ -601,14 +608,17 @@ static int do_set_window(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
|
||||
return native_ioctl(file, VIDIOCSWIN, (unsigned long)vw);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
union {
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
struct video_tuner vt;
|
||||
struct video_buffer vb;
|
||||
struct video_window vw;
|
||||
struct video_code vc;
|
||||
#endif
|
||||
struct v4l2_format v2f;
|
||||
struct v4l2_buffer v2b;
|
||||
struct v4l2_framebuffer v2fb;
|
||||
@@ -624,6 +634,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
|
||||
/* First, convert the command. */
|
||||
switch(cmd) {
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break;
|
||||
case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break;
|
||||
case VIDIOCGWIN32: cmd = VIDIOCGWIN; break;
|
||||
@@ -631,6 +642,8 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break;
|
||||
case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break;
|
||||
case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break;
|
||||
case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
|
||||
#endif
|
||||
case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break;
|
||||
case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break;
|
||||
case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break;
|
||||
@@ -647,10 +660,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
||||
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
||||
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
||||
case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
|
||||
};
|
||||
|
||||
switch(cmd) {
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCSTUNER:
|
||||
case VIDIOCGTUNER:
|
||||
err = get_video_tuner32(&karg.vt, up);
|
||||
@@ -664,6 +677,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
break;
|
||||
|
||||
case VIDIOCSFREQ:
|
||||
#endif
|
||||
case VIDIOC_S_INPUT:
|
||||
case VIDIOC_OVERLAY:
|
||||
case VIDIOC_STREAMON:
|
||||
@@ -717,18 +731,21 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
compatible_arg = 0;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGWIN:
|
||||
case VIDIOCGFBUF:
|
||||
case VIDIOCGFREQ:
|
||||
#endif
|
||||
case VIDIOC_G_FBUF:
|
||||
case VIDIOC_G_INPUT:
|
||||
compatible_arg = 0;
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCSMICROCODE:
|
||||
err = microcode32(&karg.vc, up);
|
||||
compatible_arg = 0;
|
||||
break;
|
||||
#endif
|
||||
};
|
||||
|
||||
if(err)
|
||||
goto out;
|
||||
|
||||
@@ -743,6 +760,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
}
|
||||
if(err == 0) {
|
||||
switch(cmd) {
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGTUNER:
|
||||
err = put_video_tuner32(&karg.vt, up);
|
||||
break;
|
||||
@@ -754,7 +772,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
case VIDIOCGFBUF:
|
||||
err = put_video_buffer32(&karg.vb, up);
|
||||
break;
|
||||
|
||||
#endif
|
||||
case VIDIOC_G_FBUF:
|
||||
err = put_v4l2_framebuffer32(&karg.v2fb, up);
|
||||
break;
|
||||
@@ -792,7 +810,9 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||
err = put_v4l2_input32(&karg.v2i, up);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGFREQ:
|
||||
#endif
|
||||
case VIDIOC_G_INPUT:
|
||||
err = put_user(((u32)karg.vx), (u32 __user *)up);
|
||||
break;
|
||||
@@ -810,6 +830,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
return ret;
|
||||
|
||||
switch (cmd) {
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCSWIN32:
|
||||
ret = do_set_window(file, cmd, arg);
|
||||
break;
|
||||
@@ -820,6 +841,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
case VIDIOCSFBUF32:
|
||||
case VIDIOCGFREQ32:
|
||||
case VIDIOCSFREQ32:
|
||||
#endif
|
||||
case VIDIOC_QUERYCAP:
|
||||
case VIDIOC_ENUM_FMT:
|
||||
case VIDIOC_G_FMT32:
|
||||
@@ -851,6 +873,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
ret = do_video_ioctl(file, cmd, arg);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Little v, the video4linux ioctls (conflict?) */
|
||||
case VIDIOCGCAP:
|
||||
case VIDIOCGCHAN:
|
||||
@@ -879,6 +902,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
case _IOR('v' , BASE_VIDIOCPRIVATE+7, int):
|
||||
ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
v4l_print_ioctl("compat_ioctl32", cmd);
|
||||
}
|
||||
|
||||
@@ -104,8 +104,8 @@ u32 cx25840_read4(struct i2c_client * client, u16 addr)
|
||||
if (i2c_master_recv(client, buffer, 4) < 4)
|
||||
return 0;
|
||||
|
||||
return (buffer[0] << 24) | (buffer[1] << 16) |
|
||||
(buffer[2] << 8) | buffer[3];
|
||||
return (buffer[3] << 24) | (buffer[2] << 16) |
|
||||
(buffer[1] << 8) | buffer[0];
|
||||
}
|
||||
|
||||
int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned and_mask,
|
||||
|
||||
@@ -1225,7 +1225,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
||||
struct v4l2_format *f = arg;
|
||||
return cx8800_try_fmt(dev,fh,f);
|
||||
}
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* --- streaming capture ------------------------------------- */
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
@@ -1584,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
||||
*id = 0;
|
||||
return 0;
|
||||
}
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCSTUNER:
|
||||
{
|
||||
struct video_tuner *v = arg;
|
||||
|
||||
@@ -961,10 +961,10 @@ int msp34xxg_thread(void *data)
|
||||
/* setup the chip*/
|
||||
msp34xxg_reset(client);
|
||||
state->std = state->radio ? 0x40 : msp_standard;
|
||||
if (state->std != 1)
|
||||
goto unmute;
|
||||
/* start autodetect */
|
||||
msp_write_dem(client, 0x20, state->std);
|
||||
if (state->std != 1)
|
||||
goto unmute;
|
||||
|
||||
/* watch autodetect */
|
||||
v4l_dbg(1, msp_debug, client, "started autodetect, waiting for result\n");
|
||||
|
||||
@@ -30,7 +30,7 @@ config USB_PWC
|
||||
|
||||
config USB_PWC_DEBUG
|
||||
bool "USB Philips Cameras verbose debug"
|
||||
depends USB_PWC
|
||||
depends on USB_PWC
|
||||
help
|
||||
Say Y here in order to have the pwc driver generate verbose debugging
|
||||
messages.
|
||||
|
||||
@@ -160,6 +160,7 @@ static struct file_operations pwc_fops = {
|
||||
.poll = pwc_video_poll,
|
||||
.mmap = pwc_video_mmap,
|
||||
.ioctl = pwc_video_ioctl,
|
||||
.compat_ioctl = v4l_compat_ioctl32,
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
static struct video_device pwc_template = {
|
||||
|
||||
@@ -2087,7 +2087,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
||||
struct v4l2_format *f = arg;
|
||||
return saa7134_try_fmt(dev,fh,f);
|
||||
}
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
struct video_mbuf *mbuf = arg;
|
||||
|
||||
@@ -1027,10 +1027,11 @@ static struct tuner_params tuner_tnf_5335mf_params[] = {
|
||||
/* 70-79 */
|
||||
/* ------------ TUNER_SAMSUNG_TCPN_2121P30A - Samsung NTSC ------------ */
|
||||
|
||||
/* '+ 4' turns on the Low Noise Amplifier */
|
||||
static struct tuner_range tuner_samsung_tcpn_2121p30a_ntsc_ranges[] = {
|
||||
{ 16 * 130.00 /*MHz*/, 0xce, 0x01, },
|
||||
{ 16 * 364.50 /*MHz*/, 0xce, 0x02, },
|
||||
{ 16 * 999.99 , 0xce, 0x08, },
|
||||
{ 16 * 130.00 /*MHz*/, 0xce, 0x01 + 4, },
|
||||
{ 16 * 364.50 /*MHz*/, 0xce, 0x02 + 4, },
|
||||
{ 16 * 999.99 , 0xce, 0x08 + 4, },
|
||||
};
|
||||
|
||||
static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = {
|
||||
@@ -1060,10 +1061,11 @@ static struct tuner_params tuner_thomson_fe6600_params[] = {
|
||||
|
||||
/* ------------ TUNER_SAMSUNG_TCPG_6121P30A - Samsung PAL ------------ */
|
||||
|
||||
/* '+ 4' turns on the Low Noise Amplifier */
|
||||
static struct tuner_range tuner_samsung_tcpg_6121p30a_pal_ranges[] = {
|
||||
{ 16 * 146.25 /*MHz*/, 0xce, 0x01, },
|
||||
{ 16 * 428.50 /*MHz*/, 0xce, 0x02, },
|
||||
{ 16 * 999.99 , 0xce, 0x08, },
|
||||
{ 16 * 146.25 /*MHz*/, 0xce, 0x01 + 4, },
|
||||
{ 16 * 428.50 /*MHz*/, 0xce, 0x02 + 4, },
|
||||
{ 16 * 999.99 , 0xce, 0x08 + 4, },
|
||||
};
|
||||
|
||||
static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = {
|
||||
|
||||
@@ -599,6 +599,10 @@ v4l_compat_translate_ioctl(struct inode *inode,
|
||||
dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n",err);
|
||||
break;
|
||||
}
|
||||
|
||||
pict->depth = ((fmt2->fmt.pix.bytesperline<<3)
|
||||
+ (fmt2->fmt.pix.width-1) )
|
||||
/fmt2->fmt.pix.width;
|
||||
pict->palette = pixelformat_to_palette(
|
||||
fmt2->fmt.pix.pixelformat);
|
||||
break;
|
||||
|
||||
@@ -202,7 +202,7 @@ static char *v4l2_memory_names[] = {
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* debug help functions */
|
||||
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
static const char *v4l1_ioctls[] = {
|
||||
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
|
||||
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
|
||||
@@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = {
|
||||
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
||||
|
||||
static const char *v4l2_int_ioctls[] = {
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
[_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
|
||||
[_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
|
||||
[_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
|
||||
@@ -367,7 +367,7 @@ void v4l_printk_ioctl(unsigned int cmd)
|
||||
(_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
|
||||
v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
|
||||
break;
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case 'v':
|
||||
printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
|
||||
(_IOC_NR(cmd) < V4L1_IOCTLS) ?
|
||||
|
||||
@@ -760,7 +760,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
||||
ret=vfd->vidioc_overlay(file, fh, *i);
|
||||
break;
|
||||
}
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* --- streaming capture ------------------------------------- */
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
|
||||
@@ -986,7 +986,7 @@ static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p)
|
||||
file->f_flags & O_NONBLOCK));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
|
||||
{
|
||||
struct vivi_fh *fh=priv;
|
||||
@@ -1328,7 +1328,7 @@ static struct video_device vivi = {
|
||||
.vidioc_s_ctrl = vidioc_s_ctrl,
|
||||
.vidioc_streamon = vidioc_streamon,
|
||||
.vidioc_streamoff = vidioc_streamoff,
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
.vidiocgmbuf = vidiocgmbuf,
|
||||
#endif
|
||||
.tvnorms = tvnorms,
|
||||
|
||||
@@ -640,7 +640,6 @@ typedef struct _MPT_ADAPTER
|
||||
struct work_struct fc_setup_reset_work;
|
||||
struct list_head fc_rports;
|
||||
spinlock_t fc_rescan_work_lock;
|
||||
int fc_rescan_work_count;
|
||||
struct work_struct fc_rescan_work;
|
||||
char fc_rescan_work_q_name[KOBJ_NAME_LEN];
|
||||
struct workqueue_struct *fc_rescan_work_q;
|
||||
|
||||
@@ -669,7 +669,10 @@ mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)
|
||||
* if still doing discovery,
|
||||
* hang loose a while until finished
|
||||
*/
|
||||
if (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) {
|
||||
if ((pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) ||
|
||||
(pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE &&
|
||||
(pp0dest->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK)
|
||||
== MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT)) {
|
||||
if (count-- > 0) {
|
||||
msleep(100);
|
||||
goto try_again;
|
||||
@@ -895,59 +898,45 @@ mptfc_rescan_devices(void *arg)
|
||||
{
|
||||
MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
|
||||
int ii;
|
||||
int work_to_do;
|
||||
u64 pn;
|
||||
unsigned long flags;
|
||||
struct mptfc_rport_info *ri;
|
||||
|
||||
do {
|
||||
/* start by tagging all ports as missing */
|
||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||
if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) {
|
||||
ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING;
|
||||
}
|
||||
/* start by tagging all ports as missing */
|
||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||
if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) {
|
||||
ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* now rescan devices known to adapter,
|
||||
* will reregister existing rports
|
||||
*/
|
||||
for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
|
||||
(void) mptfc_GetFcPortPage0(ioc, ii);
|
||||
mptfc_init_host_attr(ioc,ii); /* refresh */
|
||||
mptfc_GetFcDevPage0(ioc,ii,mptfc_register_dev);
|
||||
/*
|
||||
* now rescan devices known to adapter,
|
||||
* will reregister existing rports
|
||||
*/
|
||||
for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) {
|
||||
(void) mptfc_GetFcPortPage0(ioc, ii);
|
||||
mptfc_init_host_attr(ioc, ii); /* refresh */
|
||||
mptfc_GetFcDevPage0(ioc, ii, mptfc_register_dev);
|
||||
}
|
||||
|
||||
/* delete devices still missing */
|
||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||
/* if newly missing, delete it */
|
||||
if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) {
|
||||
|
||||
ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED|
|
||||
MPT_RPORT_INFO_FLAGS_MISSING);
|
||||
fc_remote_port_delete(ri->rport); /* won't sleep */
|
||||
ri->rport = NULL;
|
||||
|
||||
pn = (u64)ri->pg0.WWPN.High << 32 |
|
||||
(u64)ri->pg0.WWPN.Low;
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"mptfc_rescan.%d: %llx deleted\n",
|
||||
ioc->name,
|
||||
ioc->sh->host_no,
|
||||
(unsigned long long)pn));
|
||||
}
|
||||
|
||||
/* delete devices still missing */
|
||||
list_for_each_entry(ri, &ioc->fc_rports, list) {
|
||||
/* if newly missing, delete it */
|
||||
if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) {
|
||||
|
||||
ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED|
|
||||
MPT_RPORT_INFO_FLAGS_MISSING);
|
||||
fc_remote_port_delete(ri->rport); /* won't sleep */
|
||||
ri->rport = NULL;
|
||||
|
||||
pn = (u64)ri->pg0.WWPN.High << 32 |
|
||||
(u64)ri->pg0.WWPN.Low;
|
||||
dfcprintk ((MYIOC_s_INFO_FMT
|
||||
"mptfc_rescan.%d: %llx deleted\n",
|
||||
ioc->name,
|
||||
ioc->sh->host_no,
|
||||
(unsigned long long)pn));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* allow multiple passes as target state
|
||||
* might have changed during scan
|
||||
*/
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_count > 2) /* only need one more */
|
||||
ioc->fc_rescan_work_count = 2;
|
||||
work_to_do = --ioc->fc_rescan_work_count;
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
} while (work_to_do);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1159,7 +1148,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
* by doing it via the workqueue, some locking is eliminated
|
||||
*/
|
||||
|
||||
ioc->fc_rescan_work_count = 1;
|
||||
queue_work(ioc->fc_rescan_work_q, &ioc->fc_rescan_work);
|
||||
flush_workqueue(ioc->fc_rescan_work_q);
|
||||
|
||||
@@ -1202,10 +1190,8 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||
case MPI_EVENT_RESCAN:
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
if (ioc->fc_rescan_work_count++ == 0) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
break;
|
||||
@@ -1248,10 +1234,8 @@ mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
||||
mptfc_SetFcPortPage1_defaults(ioc);
|
||||
spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
|
||||
if (ioc->fc_rescan_work_q) {
|
||||
if (ioc->fc_rescan_work_count++ == 0) {
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
queue_work(ioc->fc_rescan_work_q,
|
||||
&ioc->fc_rescan_work);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
|
||||
}
|
||||
|
||||
@@ -79,7 +79,8 @@ static int mmc_queue_thread(void *d)
|
||||
spin_lock_irq(q->queue_lock);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (!blk_queue_plugged(q))
|
||||
mq->req = req = elv_next_request(q);
|
||||
req = elv_next_request(q);
|
||||
mq->req = req;
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
|
||||
if (!req) {
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
#include "wbsd.h"
|
||||
|
||||
#define DRIVER_NAME "wbsd"
|
||||
#define DRIVER_VERSION "1.5"
|
||||
#define DRIVER_VERSION "1.6"
|
||||
|
||||
#define DBG(x...) \
|
||||
pr_debug(DRIVER_NAME ": " x)
|
||||
@@ -1439,13 +1439,13 @@ static int __devinit wbsd_scan(struct wbsd_host *host)
|
||||
|
||||
static int __devinit wbsd_request_region(struct wbsd_host *host, int base)
|
||||
{
|
||||
if (io & 0x7)
|
||||
if (base & 0x7)
|
||||
return -EINVAL;
|
||||
|
||||
if (!request_region(base, 8, DRIVER_NAME))
|
||||
return -EIO;
|
||||
|
||||
host->base = io;
|
||||
host->base = base;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1773,7 +1773,7 @@ static int __devinit wbsd_init(struct device *dev, int base, int irq, int dma,
|
||||
/*
|
||||
* Request resources.
|
||||
*/
|
||||
ret = wbsd_request_resources(host, io, irq, dma);
|
||||
ret = wbsd_request_resources(host, base, irq, dma);
|
||||
if (ret) {
|
||||
wbsd_release_resources(host);
|
||||
wbsd_free_mmc(dev);
|
||||
@@ -1861,6 +1861,7 @@ static void __devexit wbsd_shutdown(struct device *dev, int pnp)
|
||||
|
||||
static int __devinit wbsd_probe(struct platform_device *dev)
|
||||
{
|
||||
/* Use the module parameters for resources */
|
||||
return wbsd_init(&dev->dev, io, irq, dma, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -130,11 +130,13 @@ static void ams_delta_hwcontrol(struct mtd_info *mtd, int cmd,
|
||||
if (ctrl & NAND_CTRL_CHANGE) {
|
||||
unsigned long bits;
|
||||
|
||||
bits = (~ctrl & NAND_NCE) << 2;
|
||||
bits |= (ctrl & NAND_CLE) << 7;
|
||||
bits |= (ctrl & NAND_ALE) << 6;
|
||||
bits = (~ctrl & NAND_NCE) ? AMS_DELTA_LATCH2_NAND_NCE : 0;
|
||||
bits |= (ctrl & NAND_CLE) ? AMS_DELTA_LATCH2_NAND_CLE : 0;
|
||||
bits |= (ctrl & NAND_ALE) ? AMS_DELTA_LATCH2_NAND_ALE : 0;
|
||||
|
||||
ams_delta_latch2_write(0xC2, bits);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_CLE |
|
||||
AMS_DELTA_LATCH2_NAND_ALE |
|
||||
AMS_DELTA_LATCH2_NAND_NCE, bits);
|
||||
}
|
||||
|
||||
if (cmd != NAND_CMD_NONE)
|
||||
|
||||
@@ -1093,9 +1093,10 @@ static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
|
||||
ret = nand_do_read_ops(mtd, from, &chip->ops);
|
||||
|
||||
*retlen = chip->ops.retlen;
|
||||
|
||||
nand_release_device(mtd);
|
||||
|
||||
*retlen = chip->ops.retlen;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1691,9 +1692,10 @@ static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
|
||||
|
||||
ret = nand_do_write_ops(mtd, to, &chip->ops);
|
||||
|
||||
*retlen = chip->ops.retlen;
|
||||
|
||||
nand_release_device(mtd);
|
||||
|
||||
*retlen = chip->ops.retlen;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1003,7 +1003,8 @@ static int corkscrew_start_xmit(struct sk_buff *skb,
|
||||
/* Calculate the next Tx descriptor entry. */
|
||||
int entry = vp->cur_tx % TX_RING_SIZE;
|
||||
struct boom_tx_desc *prev_entry;
|
||||
unsigned long flags, i;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
if (vp->tx_full) /* No room to transmit with */
|
||||
return 1;
|
||||
|
||||
@@ -899,7 +899,7 @@ memory_squeeze:
|
||||
}
|
||||
|
||||
|
||||
static inline void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp)
|
||||
static void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp)
|
||||
{
|
||||
struct i596_cmd *ptr;
|
||||
|
||||
@@ -932,7 +932,8 @@ static inline void i596_cleanup_cmd(struct net_device *dev, struct i596_private
|
||||
lp->scb.cmd = I596_NULL;
|
||||
}
|
||||
|
||||
static inline void i596_reset(struct net_device *dev, struct i596_private *lp, int ioaddr)
|
||||
static void i596_reset(struct net_device *dev, struct i596_private *lp,
|
||||
int ioaddr)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
@@ -1578,7 +1579,7 @@ static int debug = -1;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "i82596 debug mask");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
if (debug >= 0)
|
||||
i596_debug = debug;
|
||||
@@ -1588,7 +1589,7 @@ int init_module(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cleanup_module(void)
|
||||
void __exit cleanup_module(void)
|
||||
{
|
||||
unregister_netdev(dev_82596);
|
||||
#ifdef __mc68000__
|
||||
|
||||
@@ -1724,6 +1724,20 @@ config VIA_RHINE_MMIO
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config VIA_RHINE_NAPI
|
||||
bool "Use Rx Polling (NAPI)"
|
||||
depends on VIA_RHINE
|
||||
help
|
||||
NAPI is a new driver API designed to reduce CPU and interrupt load
|
||||
when the driver is receiving lots of packets from the card.
|
||||
|
||||
If your estimated Rx load is 10kpps or more, or if the card will be
|
||||
deployed on potentially unfriendly networks (e.g. in a firewall),
|
||||
then say Y here.
|
||||
|
||||
See <file:Documentation/networking/NAPI_HOWTO.txt> for more
|
||||
information.
|
||||
|
||||
config LAN_SAA9730
|
||||
bool "Philips SAA9730 Ethernet support (EXPERIMENTAL)"
|
||||
depends on NET_PCI && EXPERIMENTAL && MIPS
|
||||
@@ -2219,6 +2233,33 @@ config GFAR_NAPI
|
||||
bool "NAPI Support"
|
||||
depends on GIANFAR
|
||||
|
||||
config UCC_GETH
|
||||
tristate "Freescale QE UCC GETH"
|
||||
depends on QUICC_ENGINE && UCC_FAST
|
||||
help
|
||||
This driver supports the Gigabit Ethernet mode of QE UCC.
|
||||
QE can be found on MPC836x CPUs.
|
||||
|
||||
config UGETH_NAPI
|
||||
bool "NAPI Support"
|
||||
depends on UCC_GETH
|
||||
|
||||
config UGETH_MAGIC_PACKET
|
||||
bool "Magic Packet detection support"
|
||||
depends on UCC_GETH
|
||||
|
||||
config UGETH_FILTERING
|
||||
bool "Mac address filtering support"
|
||||
depends on UCC_GETH
|
||||
|
||||
config UGETH_TX_ON_DEMOND
|
||||
bool "Transmit on Demond support"
|
||||
depends on UCC_GETH
|
||||
|
||||
config UGETH_HAS_GIGA
|
||||
bool
|
||||
depends on UCC_GETH && MPC836x
|
||||
|
||||
config MV643XX_ETH
|
||||
tristate "MV-643XX Ethernet support"
|
||||
depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MOMENCO_OCELOT_3 || PPC_MULTIPLATFORM
|
||||
|
||||
@@ -18,6 +18,9 @@ gianfar_driver-objs := gianfar.o \
|
||||
gianfar_mii.o \
|
||||
gianfar_sysfs.o
|
||||
|
||||
obj-$(CONFIG_UCC_GETH) += ucc_geth_driver.o
|
||||
ucc_geth_driver-objs := ucc_geth.o ucc_geth_phy.o
|
||||
|
||||
#
|
||||
# link order important here
|
||||
#
|
||||
|
||||
@@ -370,8 +370,7 @@ MODULE_PARM_DESC(mem, "Memory base address(es)");
|
||||
MODULE_DESCRIPTION("Ansel AC3200 EISA ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
int
|
||||
init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int this_dev, found = 0;
|
||||
|
||||
@@ -1030,7 +1030,7 @@ module_param(io, int, 0);
|
||||
module_param(irq, int, 0);
|
||||
module_param(board_type, int, 0);
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
if (io == 0)
|
||||
printk(KERN_WARNING "%s: You shouldn't autoprobe with insmod\n",
|
||||
|
||||
@@ -901,7 +901,7 @@ MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
|
||||
MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
|
||||
MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
if (io == 0)
|
||||
printk("at1700: You should not use auto-probing with insmod!\n");
|
||||
|
||||
@@ -56,8 +56,8 @@
|
||||
|
||||
#define DRV_MODULE_NAME "bnx2"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "1.4.43"
|
||||
#define DRV_MODULE_RELDATE "June 28, 2006"
|
||||
#define DRV_MODULE_VERSION "1.4.44"
|
||||
#define DRV_MODULE_RELDATE "August 10, 2006"
|
||||
|
||||
#define RUN_AT(x) (jiffies + (x))
|
||||
|
||||
@@ -209,8 +209,10 @@ MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
|
||||
|
||||
static inline u32 bnx2_tx_avail(struct bnx2 *bp)
|
||||
{
|
||||
u32 diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons);
|
||||
u32 diff;
|
||||
|
||||
smp_mb();
|
||||
diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons);
|
||||
if (diff > MAX_TX_DESC_CNT)
|
||||
diff = (diff & MAX_TX_DESC_CNT) - 1;
|
||||
return (bp->tx_ring_size - diff);
|
||||
@@ -1569,7 +1571,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index)
|
||||
struct rx_bd *rxbd = &bp->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
|
||||
unsigned long align;
|
||||
|
||||
skb = dev_alloc_skb(bp->rx_buf_size);
|
||||
skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
|
||||
if (skb == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -1578,7 +1580,6 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index)
|
||||
skb_reserve(skb, 8 - align);
|
||||
}
|
||||
|
||||
skb->dev = bp->dev;
|
||||
mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
|
||||
@@ -1686,15 +1687,20 @@ bnx2_tx_int(struct bnx2 *bp)
|
||||
}
|
||||
|
||||
bp->tx_cons = sw_cons;
|
||||
/* Need to make the tx_cons update visible to bnx2_start_xmit()
|
||||
* before checking for netif_queue_stopped(). Without the
|
||||
* memory barrier, there is a small possibility that bnx2_start_xmit()
|
||||
* will miss it and cause the queue to be stopped forever.
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
if (unlikely(netif_queue_stopped(bp->dev))) {
|
||||
spin_lock(&bp->tx_lock);
|
||||
if (unlikely(netif_queue_stopped(bp->dev)) &&
|
||||
(bnx2_tx_avail(bp) > bp->tx_wake_thresh)) {
|
||||
netif_tx_lock(bp->dev);
|
||||
if ((netif_queue_stopped(bp->dev)) &&
|
||||
(bnx2_tx_avail(bp) > MAX_SKB_FRAGS)) {
|
||||
|
||||
(bnx2_tx_avail(bp) > bp->tx_wake_thresh))
|
||||
netif_wake_queue(bp->dev);
|
||||
}
|
||||
spin_unlock(&bp->tx_lock);
|
||||
netif_tx_unlock(bp->dev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1786,7 +1792,7 @@ bnx2_rx_int(struct bnx2 *bp, int budget)
|
||||
if ((bp->dev->mtu > 1500) && (len <= RX_COPY_THRESH)) {
|
||||
struct sk_buff *new_skb;
|
||||
|
||||
new_skb = dev_alloc_skb(len + 2);
|
||||
new_skb = netdev_alloc_skb(bp->dev, len + 2);
|
||||
if (new_skb == NULL)
|
||||
goto reuse_rx;
|
||||
|
||||
@@ -1797,7 +1803,6 @@ bnx2_rx_int(struct bnx2 *bp, int budget)
|
||||
|
||||
skb_reserve(new_skb, 2);
|
||||
skb_put(new_skb, len);
|
||||
new_skb->dev = bp->dev;
|
||||
|
||||
bnx2_reuse_rx_skb(bp, skb,
|
||||
sw_ring_cons, sw_ring_prod);
|
||||
@@ -3503,6 +3508,8 @@ bnx2_init_tx_ring(struct bnx2 *bp)
|
||||
struct tx_bd *txbd;
|
||||
u32 val;
|
||||
|
||||
bp->tx_wake_thresh = bp->tx_ring_size / 2;
|
||||
|
||||
txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT];
|
||||
|
||||
txbd->tx_bd_haddr_hi = (u64) bp->tx_desc_mapping >> 32;
|
||||
@@ -3952,7 +3959,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
|
||||
return -EINVAL;
|
||||
|
||||
pkt_size = 1514;
|
||||
skb = dev_alloc_skb(pkt_size);
|
||||
skb = netdev_alloc_skb(bp->dev, pkt_size);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
packet = skb_put(skb, pkt_size);
|
||||
@@ -4390,10 +4397,8 @@ bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
|
||||
#endif
|
||||
|
||||
/* Called with netif_tx_lock.
|
||||
* hard_start_xmit is pseudo-lockless - a lock is only required when
|
||||
* the tx queue is full. This way, we get the benefit of lockless
|
||||
* operations most of the time without the complexities to handle
|
||||
* netif_stop_queue/wake_queue race conditions.
|
||||
* bnx2_tx_int() runs without netif_tx_lock unless it needs to call
|
||||
* netif_wake_queue().
|
||||
*/
|
||||
static int
|
||||
bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
@@ -4512,12 +4517,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) {
|
||||
spin_lock(&bp->tx_lock);
|
||||
netif_stop_queue(dev);
|
||||
|
||||
if (bnx2_tx_avail(bp) > MAX_SKB_FRAGS)
|
||||
if (bnx2_tx_avail(bp) > bp->tx_wake_thresh)
|
||||
netif_wake_queue(dev);
|
||||
spin_unlock(&bp->tx_lock);
|
||||
}
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
@@ -5628,7 +5630,6 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||||
bp->pdev = pdev;
|
||||
|
||||
spin_lock_init(&bp->phy_lock);
|
||||
spin_lock_init(&bp->tx_lock);
|
||||
INIT_WORK(&bp->reset_task, bnx2_reset_task, bp);
|
||||
|
||||
dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0);
|
||||
@@ -5751,7 +5752,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||||
bp->mac_addr[5] = (u8) reg;
|
||||
|
||||
bp->tx_ring_size = MAX_TX_DESC_CNT;
|
||||
bnx2_set_rx_ring_size(bp, 100);
|
||||
bnx2_set_rx_ring_size(bp, 255);
|
||||
|
||||
bp->rx_csum = 1;
|
||||
|
||||
|
||||
@@ -3890,10 +3890,6 @@ struct bnx2 {
|
||||
u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES)));
|
||||
u16 tx_prod;
|
||||
|
||||
struct tx_bd *tx_desc_ring;
|
||||
struct sw_bd *tx_buf_ring;
|
||||
int tx_ring_size;
|
||||
|
||||
u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES)));
|
||||
u16 hw_tx_cons;
|
||||
|
||||
@@ -3916,9 +3912,11 @@ struct bnx2 {
|
||||
struct sw_bd *rx_buf_ring;
|
||||
struct rx_bd *rx_desc_ring[MAX_RX_RINGS];
|
||||
|
||||
/* Only used to synchronize netif_stop_queue/wake_queue when tx */
|
||||
/* ring is full */
|
||||
spinlock_t tx_lock;
|
||||
/* TX constants */
|
||||
struct tx_bd *tx_desc_ring;
|
||||
struct sw_bd *tx_buf_ring;
|
||||
int tx_ring_size;
|
||||
u32 tx_wake_thresh;
|
||||
|
||||
/* End of fields used in the performance code paths. */
|
||||
|
||||
|
||||
@@ -1905,8 +1905,7 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
*/
|
||||
|
||||
int
|
||||
init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
|
||||
struct net_local *lp;
|
||||
|
||||
@@ -339,6 +339,17 @@ static void dm9000_timeout(struct net_device *dev)
|
||||
spin_unlock_irqrestore(&db->lock,flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
/*
|
||||
*Used by netconsole
|
||||
*/
|
||||
static void dm9000_poll_controller(struct net_device *dev)
|
||||
{
|
||||
disable_irq(dev->irq);
|
||||
dm9000_interrupt(dev->irq,dev,NULL);
|
||||
enable_irq(dev->irq);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* dm9000_release_board
|
||||
*
|
||||
@@ -538,6 +549,9 @@ dm9000_probe(struct platform_device *pdev)
|
||||
ndev->stop = &dm9000_stop;
|
||||
ndev->get_stats = &dm9000_get_stats;
|
||||
ndev->set_multicast_list = &dm9000_hash_table;
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
ndev->poll_controller = &dm9000_poll_controller;
|
||||
#endif
|
||||
|
||||
#ifdef DM9000_PROGRAM_EEPROM
|
||||
program_eeprom(db);
|
||||
|
||||
@@ -173,8 +173,11 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
|
||||
static int debug = 3;
|
||||
static int eeprom_bad_csum_allow = 0;
|
||||
module_param(debug, int, 0);
|
||||
module_param(eeprom_bad_csum_allow, int, 0);
|
||||
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
|
||||
MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums");
|
||||
#define DPRINTK(nlevel, klevel, fmt, args...) \
|
||||
(void)((NETIF_MSG_##nlevel & nic->msg_enable) && \
|
||||
printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \
|
||||
@@ -756,7 +759,8 @@ static int e100_eeprom_load(struct nic *nic)
|
||||
checksum = le16_to_cpu(0xBABA - checksum);
|
||||
if(checksum != nic->eeprom[nic->eeprom_wc - 1]) {
|
||||
DPRINTK(PROBE, ERR, "EEPROM corrupted\n");
|
||||
return -EAGAIN;
|
||||
if (!eeprom_bad_csum_allow)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -105,6 +105,33 @@ static int32_t e1000_configure_kmrn_for_10_100(struct e1000_hw *hw,
|
||||
uint16_t duplex);
|
||||
static int32_t e1000_configure_kmrn_for_1000(struct e1000_hw *hw);
|
||||
|
||||
static int32_t e1000_erase_ich8_4k_segment(struct e1000_hw *hw,
|
||||
uint32_t segment);
|
||||
static int32_t e1000_get_software_flag(struct e1000_hw *hw);
|
||||
static int32_t e1000_get_software_semaphore(struct e1000_hw *hw);
|
||||
static int32_t e1000_init_lcd_from_nvm(struct e1000_hw *hw);
|
||||
static int32_t e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw);
|
||||
static int32_t e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset,
|
||||
uint16_t words, uint16_t *data);
|
||||
static int32_t e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t* data);
|
||||
static int32_t e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index,
|
||||
uint16_t *data);
|
||||
static int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr,
|
||||
uint16_t *data);
|
||||
static void e1000_release_software_flag(struct e1000_hw *hw);
|
||||
static void e1000_release_software_semaphore(struct e1000_hw *hw);
|
||||
static int32_t e1000_set_pci_ex_no_snoop(struct e1000_hw *hw,
|
||||
uint32_t no_snoop);
|
||||
static int32_t e1000_verify_write_ich8_byte(struct e1000_hw *hw,
|
||||
uint32_t index, uint8_t byte);
|
||||
static int32_t e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset,
|
||||
uint16_t words, uint16_t *data);
|
||||
static int32_t e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t data);
|
||||
static int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr,
|
||||
uint16_t data);
|
||||
|
||||
/* IGP cable length table */
|
||||
static const
|
||||
uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] =
|
||||
@@ -3233,7 +3260,7 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw)
|
||||
return data;
|
||||
}
|
||||
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
|
||||
{
|
||||
uint32_t swfw_sync = 0;
|
||||
@@ -3277,7 +3304,7 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask)
|
||||
{
|
||||
uint32_t swfw_sync;
|
||||
@@ -3575,7 +3602,7 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw,
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_read_kmrn_reg(struct e1000_hw *hw,
|
||||
uint32_t reg_addr,
|
||||
uint16_t *data)
|
||||
@@ -3608,7 +3635,7 @@ e1000_read_kmrn_reg(struct e1000_hw *hw,
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_write_kmrn_reg(struct e1000_hw *hw,
|
||||
uint32_t reg_addr,
|
||||
uint16_t data)
|
||||
@@ -3839,7 +3866,7 @@ e1000_phy_powerdown_workaround(struct e1000_hw *hw)
|
||||
*
|
||||
* hw - struct containing variables accessed by shared code
|
||||
******************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw)
|
||||
{
|
||||
int32_t ret_val;
|
||||
@@ -4086,7 +4113,7 @@ e1000_phy_igp_get_info(struct e1000_hw *hw,
|
||||
* hw - Struct containing variables accessed by shared code
|
||||
* phy_info - PHY information structure
|
||||
******************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_phy_ife_get_info(struct e1000_hw *hw,
|
||||
struct e1000_phy_info *phy_info)
|
||||
{
|
||||
@@ -5643,6 +5670,7 @@ e1000_init_rx_addrs(struct e1000_hw *hw)
|
||||
* for the first 15 multicast addresses, and hashes the rest into the
|
||||
* multicast table.
|
||||
*****************************************************************************/
|
||||
#if 0
|
||||
void
|
||||
e1000_mc_addr_list_update(struct e1000_hw *hw,
|
||||
uint8_t *mc_addr_list,
|
||||
@@ -5719,6 +5747,7 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
|
||||
}
|
||||
DEBUGOUT("MC Update Complete\n");
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/******************************************************************************
|
||||
* Hashes an address to determine its location in the multicast table
|
||||
@@ -6587,6 +6616,7 @@ e1000_get_bus_info(struct e1000_hw *hw)
|
||||
* hw - Struct containing variables accessed by shared code
|
||||
* offset - offset to read from
|
||||
*****************************************************************************/
|
||||
#if 0
|
||||
uint32_t
|
||||
e1000_read_reg_io(struct e1000_hw *hw,
|
||||
uint32_t offset)
|
||||
@@ -6597,6 +6627,7 @@ e1000_read_reg_io(struct e1000_hw *hw,
|
||||
e1000_io_write(hw, io_addr, offset);
|
||||
return e1000_io_read(hw, io_data);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/******************************************************************************
|
||||
* Writes a value to one of the devices registers using port I/O (as opposed to
|
||||
@@ -7909,6 +7940,7 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw)
|
||||
* returns: - none.
|
||||
*
|
||||
***************************************************************************/
|
||||
#if 0
|
||||
void
|
||||
e1000_enable_pciex_master(struct e1000_hw *hw)
|
||||
{
|
||||
@@ -7923,6 +7955,7 @@ e1000_enable_pciex_master(struct e1000_hw *hw)
|
||||
ctrl &= ~E1000_CTRL_GIO_MASTER_DISABLE;
|
||||
E1000_WRITE_REG(hw, CTRL, ctrl);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@@ -8148,7 +8181,7 @@ e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
|
||||
* E1000_SUCCESS at any other case.
|
||||
*
|
||||
***************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_get_software_semaphore(struct e1000_hw *hw)
|
||||
{
|
||||
int32_t timeout = hw->eeprom.word_size + 1;
|
||||
@@ -8183,7 +8216,7 @@ e1000_get_software_semaphore(struct e1000_hw *hw)
|
||||
* hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
***************************************************************************/
|
||||
void
|
||||
static void
|
||||
e1000_release_software_semaphore(struct e1000_hw *hw)
|
||||
{
|
||||
uint32_t swsm;
|
||||
@@ -8265,7 +8298,7 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw)
|
||||
* returns: E1000_SUCCESS
|
||||
*
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop)
|
||||
{
|
||||
uint32_t gcr_reg = 0;
|
||||
@@ -8306,7 +8339,7 @@ e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop)
|
||||
* hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
***************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_get_software_flag(struct e1000_hw *hw)
|
||||
{
|
||||
int32_t timeout = PHY_CFG_TIMEOUT;
|
||||
@@ -8345,7 +8378,7 @@ e1000_get_software_flag(struct e1000_hw *hw)
|
||||
* hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
***************************************************************************/
|
||||
void
|
||||
static void
|
||||
e1000_release_software_flag(struct e1000_hw *hw)
|
||||
{
|
||||
uint32_t extcnf_ctrl;
|
||||
@@ -8369,6 +8402,7 @@ e1000_release_software_flag(struct e1000_hw *hw)
|
||||
* hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
***************************************************************************/
|
||||
#if 0
|
||||
int32_t
|
||||
e1000_ife_disable_dynamic_power_down(struct e1000_hw *hw)
|
||||
{
|
||||
@@ -8388,6 +8422,7 @@ e1000_ife_disable_dynamic_power_down(struct e1000_hw *hw)
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
@@ -8397,6 +8432,7 @@ e1000_ife_disable_dynamic_power_down(struct e1000_hw *hw)
|
||||
* hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
***************************************************************************/
|
||||
#if 0
|
||||
int32_t
|
||||
e1000_ife_enable_dynamic_power_down(struct e1000_hw *hw)
|
||||
{
|
||||
@@ -8416,6 +8452,7 @@ e1000_ife_enable_dynamic_power_down(struct e1000_hw *hw)
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/******************************************************************************
|
||||
* Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
|
||||
@@ -8426,7 +8463,7 @@ e1000_ife_enable_dynamic_power_down(struct e1000_hw *hw)
|
||||
* data - word read from the EEPROM
|
||||
* words - number of words to read
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words,
|
||||
uint16_t *data)
|
||||
{
|
||||
@@ -8482,7 +8519,7 @@ e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words,
|
||||
* words - number of words to write
|
||||
* data - words to write to the EEPROM
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words,
|
||||
uint16_t *data)
|
||||
{
|
||||
@@ -8529,7 +8566,7 @@ e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words,
|
||||
*
|
||||
* hw - The pointer to the hw structure
|
||||
****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_ich8_cycle_init(struct e1000_hw *hw)
|
||||
{
|
||||
union ich8_hws_flash_status hsfsts;
|
||||
@@ -8596,7 +8633,7 @@ e1000_ich8_cycle_init(struct e1000_hw *hw)
|
||||
*
|
||||
* hw - The pointer to the hw structure
|
||||
****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_ich8_flash_cycle(struct e1000_hw *hw, uint32_t timeout)
|
||||
{
|
||||
union ich8_hws_flash_ctrl hsflctl;
|
||||
@@ -8631,7 +8668,7 @@ e1000_ich8_flash_cycle(struct e1000_hw *hw, uint32_t timeout)
|
||||
* size - Size of data to read, 1=byte 2=word
|
||||
* data - Pointer to the word to store the value read.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index,
|
||||
uint32_t size, uint16_t* data)
|
||||
{
|
||||
@@ -8710,7 +8747,7 @@ e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index,
|
||||
* size - Size of data to read, 1=byte 2=word
|
||||
* data - The byte(s) to write to the NVM.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_write_ich8_data(struct e1000_hw *hw, uint32_t index, uint32_t size,
|
||||
uint16_t data)
|
||||
{
|
||||
@@ -8785,7 +8822,7 @@ e1000_write_ich8_data(struct e1000_hw *hw, uint32_t index, uint32_t size,
|
||||
* index - The index of the byte to read.
|
||||
* data - Pointer to a byte to store the value read.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t* data)
|
||||
{
|
||||
int32_t status = E1000_SUCCESS;
|
||||
@@ -8808,7 +8845,7 @@ e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t* data)
|
||||
* index - The index of the byte to write.
|
||||
* byte - The byte to write to the NVM.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte)
|
||||
{
|
||||
int32_t error = E1000_SUCCESS;
|
||||
@@ -8839,7 +8876,7 @@ e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte)
|
||||
* index - The index of the byte to read.
|
||||
* data - The byte to write to the NVM.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t data)
|
||||
{
|
||||
int32_t status = E1000_SUCCESS;
|
||||
@@ -8857,7 +8894,7 @@ e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t data)
|
||||
* index - The starting byte index of the word to read.
|
||||
* data - Pointer to a word to store the value read.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t *data)
|
||||
{
|
||||
int32_t status = E1000_SUCCESS;
|
||||
@@ -8872,6 +8909,7 @@ e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t *data)
|
||||
* index - The starting byte index of the word to read.
|
||||
* data - The word to write to the NVM.
|
||||
*****************************************************************************/
|
||||
#if 0
|
||||
int32_t
|
||||
e1000_write_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t data)
|
||||
{
|
||||
@@ -8879,6 +8917,7 @@ e1000_write_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t data)
|
||||
status = e1000_write_ich8_data(hw, index, 2, data);
|
||||
return status;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/******************************************************************************
|
||||
* Erases the bank specified. Each bank is a 4k block. Segments are 0 based.
|
||||
@@ -8887,7 +8926,7 @@ e1000_write_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t data)
|
||||
* hw - pointer to e1000_hw structure
|
||||
* segment - 0 for first segment, 1 for second segment, etc.
|
||||
*****************************************************************************/
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t segment)
|
||||
{
|
||||
union ich8_hws_flash_status hsfsts;
|
||||
@@ -8984,6 +9023,7 @@ e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t segment)
|
||||
* hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
*****************************************************************************/
|
||||
#if 0
|
||||
int32_t
|
||||
e1000_duplex_reversal(struct e1000_hw *hw)
|
||||
{
|
||||
@@ -9012,8 +9052,9 @@ e1000_duplex_reversal(struct e1000_hw *hw)
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
|
||||
uint32_t cnf_base_addr, uint32_t cnf_size)
|
||||
{
|
||||
@@ -9047,7 +9088,7 @@ e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw,
|
||||
}
|
||||
|
||||
|
||||
int32_t
|
||||
static int32_t
|
||||
e1000_init_lcd_from_nvm(struct e1000_hw *hw)
|
||||
{
|
||||
uint32_t reg_data, cnf_base_addr, cnf_size, ret_val, loop;
|
||||
|
||||
@@ -323,13 +323,8 @@ int32_t e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t dat
|
||||
int32_t e1000_phy_hw_reset(struct e1000_hw *hw);
|
||||
int32_t e1000_phy_reset(struct e1000_hw *hw);
|
||||
void e1000_phy_powerdown_workaround(struct e1000_hw *hw);
|
||||
int32_t e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw);
|
||||
int32_t e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw, uint32_t cnf_base_addr, uint32_t cnf_size);
|
||||
int32_t e1000_init_lcd_from_nvm(struct e1000_hw *hw);
|
||||
int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
|
||||
int32_t e1000_validate_mdi_setting(struct e1000_hw *hw);
|
||||
int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data);
|
||||
int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data);
|
||||
|
||||
/* EEPROM Functions */
|
||||
int32_t e1000_init_eeprom_params(struct e1000_hw *hw);
|
||||
@@ -400,13 +395,8 @@ int32_t e1000_update_eeprom_checksum(struct e1000_hw *hw);
|
||||
int32_t e1000_write_eeprom(struct e1000_hw *hw, uint16_t reg, uint16_t words, uint16_t *data);
|
||||
int32_t e1000_read_part_num(struct e1000_hw *hw, uint32_t * part_num);
|
||||
int32_t e1000_read_mac_addr(struct e1000_hw * hw);
|
||||
int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);
|
||||
void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);
|
||||
void e1000_release_software_flag(struct e1000_hw *hw);
|
||||
int32_t e1000_get_software_flag(struct e1000_hw *hw);
|
||||
|
||||
/* Filters (multicast, vlan, receive) */
|
||||
void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad, uint32_t rar_used_count);
|
||||
uint32_t e1000_hash_mc_addr(struct e1000_hw *hw, uint8_t * mc_addr);
|
||||
void e1000_mta_set(struct e1000_hw *hw, uint32_t hash_value);
|
||||
void e1000_rar_set(struct e1000_hw *hw, uint8_t * mc_addr, uint32_t rar_index);
|
||||
@@ -431,31 +421,9 @@ void e1000_pci_clear_mwi(struct e1000_hw *hw);
|
||||
void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
|
||||
void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
|
||||
/* Port I/O is only supported on 82544 and newer */
|
||||
uint32_t e1000_io_read(struct e1000_hw *hw, unsigned long port);
|
||||
uint32_t e1000_read_reg_io(struct e1000_hw *hw, uint32_t offset);
|
||||
void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value);
|
||||
void e1000_enable_pciex_master(struct e1000_hw *hw);
|
||||
int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
|
||||
int32_t e1000_get_software_semaphore(struct e1000_hw *hw);
|
||||
void e1000_release_software_semaphore(struct e1000_hw *hw);
|
||||
int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
||||
int32_t e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop);
|
||||
|
||||
int32_t e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t *data);
|
||||
int32_t e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t byte);
|
||||
int32_t e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t byte);
|
||||
int32_t e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index,
|
||||
uint16_t *data);
|
||||
int32_t e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index,
|
||||
uint32_t size, uint16_t *data);
|
||||
int32_t e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset,
|
||||
uint16_t words, uint16_t *data);
|
||||
int32_t e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset,
|
||||
uint16_t words, uint16_t *data);
|
||||
int32_t e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t segment);
|
||||
|
||||
|
||||
#define E1000_READ_REG_IO(a, reg) \
|
||||
|
||||
@@ -4386,11 +4386,13 @@ e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
|
||||
pci_write_config_word(adapter->pdev, reg, *value);
|
||||
}
|
||||
|
||||
#if 0
|
||||
uint32_t
|
||||
e1000_io_read(struct e1000_hw *hw, unsigned long port)
|
||||
{
|
||||
return inl(port);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
void
|
||||
e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value)
|
||||
|
||||
@@ -425,8 +425,8 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
/* This is set up so that only a single autoprobe takes place per call.
|
||||
ISA device autoprobes on a running machine are not recommended. */
|
||||
int
|
||||
init_module(void)
|
||||
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int this_dev, found = 0;
|
||||
|
||||
@@ -1807,8 +1807,7 @@ MODULE_PARM_DESC(irq, "EtherExpress Pro/10 IRQ number(s)");
|
||||
MODULE_PARM_DESC(mem, "EtherExpress Pro/10 Rx buffer size(es) in kB (3-29)");
|
||||
MODULE_PARM_DESC(autodetect, "EtherExpress Pro/10 force board(s) detection (0-1)");
|
||||
|
||||
int
|
||||
init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int i;
|
||||
|
||||
@@ -1698,7 +1698,7 @@ MODULE_LICENSE("GPL");
|
||||
* are specified, we verify and then use them. If no parameters are given, we
|
||||
* autoprobe for one card only.
|
||||
*/
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int this_dev, found = 0;
|
||||
|
||||
@@ -421,8 +421,7 @@ MODULE_PARM_DESC(mem, "memory base address(es)");
|
||||
MODULE_DESCRIPTION("Racal-Interlan ES3210 EISA ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
int
|
||||
init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int this_dev, found = 0;
|
||||
|
||||
@@ -1434,7 +1434,7 @@ MODULE_PARM_DESC(mediatype, "eth16i media type of interface(s) (bnc,tp,dix,auto,
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "eth16i debug level (0-6)");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
int this_dev, found = 0;
|
||||
struct net_device *dev;
|
||||
|
||||
@@ -92,7 +92,7 @@ static int full_duplex[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
/* These identify the driver base version and may not be removed. */
|
||||
static char version[] __devinitdata =
|
||||
static char version[] =
|
||||
KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE "\n";
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
obj-$(CONFIG_FS_ENET) += fs_enet.o
|
||||
|
||||
obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o
|
||||
obj-$(CONFIG_8260) += mac-fcc.o
|
||||
obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o mii-fec.o
|
||||
obj-$(CONFIG_CPM2) += mac-fcc.o mii-bitbang.o
|
||||
|
||||
fs_enet-objs := fs_enet-main.o fs_enet-mii.o mii-bitbang.o mii-fixed.o
|
||||
fs_enet-objs := fs_enet-main.o
|
||||
|
||||
42
drivers/net/fs_enet/fec.h
Normal file
42
drivers/net/fs_enet/fec.h
Normal file
@@ -0,0 +1,42 @@
|
||||
#ifndef FS_ENET_FEC_H
|
||||
#define FS_ENET_FEC_H
|
||||
|
||||
/* CRC polynomium used by the FEC for the multicast group filtering */
|
||||
#define FEC_CRC_POLY 0x04C11DB7
|
||||
|
||||
#define FEC_MAX_MULTICAST_ADDRS 64
|
||||
|
||||
/* Interrupt events/masks.
|
||||
*/
|
||||
#define FEC_ENET_HBERR 0x80000000U /* Heartbeat error */
|
||||
#define FEC_ENET_BABR 0x40000000U /* Babbling receiver */
|
||||
#define FEC_ENET_BABT 0x20000000U /* Babbling transmitter */
|
||||
#define FEC_ENET_GRA 0x10000000U /* Graceful stop complete */
|
||||
#define FEC_ENET_TXF 0x08000000U /* Full frame transmitted */
|
||||
#define FEC_ENET_TXB 0x04000000U /* A buffer was transmitted */
|
||||
#define FEC_ENET_RXF 0x02000000U /* Full frame received */
|
||||
#define FEC_ENET_RXB 0x01000000U /* A buffer was received */
|
||||
#define FEC_ENET_MII 0x00800000U /* MII interrupt */
|
||||
#define FEC_ENET_EBERR 0x00400000U /* SDMA bus error */
|
||||
|
||||
#define FEC_ECNTRL_PINMUX 0x00000004
|
||||
#define FEC_ECNTRL_ETHER_EN 0x00000002
|
||||
#define FEC_ECNTRL_RESET 0x00000001
|
||||
|
||||
#define FEC_RCNTRL_BC_REJ 0x00000010
|
||||
#define FEC_RCNTRL_PROM 0x00000008
|
||||
#define FEC_RCNTRL_MII_MODE 0x00000004
|
||||
#define FEC_RCNTRL_DRT 0x00000002
|
||||
#define FEC_RCNTRL_LOOP 0x00000001
|
||||
|
||||
#define FEC_TCNTRL_FDEN 0x00000004
|
||||
#define FEC_TCNTRL_HBC 0x00000002
|
||||
#define FEC_TCNTRL_GTS 0x00000001
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Delay to wait for FEC reset command to complete (in us)
|
||||
*/
|
||||
#define FEC_RESET_DELAY 50
|
||||
#endif
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
#include <asm/pgtable.h>
|
||||
@@ -682,35 +683,6 @@ static void fs_free_irq(struct net_device *dev, int irq)
|
||||
(*fep->ops->post_free_irq)(dev, irq);
|
||||
}
|
||||
|
||||
/**********************************************************************************/
|
||||
|
||||
/* This interrupt occurs when the PHY detects a link change. */
|
||||
static irqreturn_t
|
||||
fs_mii_link_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
struct fs_enet_private *fep;
|
||||
const struct fs_platform_info *fpi;
|
||||
|
||||
fep = netdev_priv(dev);
|
||||
fpi = fep->fpi;
|
||||
|
||||
/*
|
||||
* Acknowledge the interrupt if possible. If we have not
|
||||
* found the PHY yet we can't process or acknowledge the
|
||||
* interrupt now. Instead we ignore this interrupt for now,
|
||||
* which we can do since it is edge triggered. It will be
|
||||
* acknowledged later by fs_enet_open().
|
||||
*/
|
||||
if (!fep->phy)
|
||||
return IRQ_NONE;
|
||||
|
||||
fs_mii_ack_int(dev);
|
||||
fs_mii_link_status_change_check(dev, 0);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void fs_timeout(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
@@ -722,10 +694,13 @@ static void fs_timeout(struct net_device *dev)
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
|
||||
if (dev->flags & IFF_UP) {
|
||||
phy_stop(fep->phydev);
|
||||
(*fep->ops->stop)(dev);
|
||||
(*fep->ops->restart)(dev);
|
||||
phy_start(fep->phydev);
|
||||
}
|
||||
|
||||
phy_start(fep->phydev);
|
||||
wake = fep->tx_free && !(CBDR_SC(fep->cur_tx) & BD_ENET_TX_READY);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
|
||||
@@ -733,35 +708,112 @@ static void fs_timeout(struct net_device *dev)
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* generic link-change handler - should be sufficient for most cases
|
||||
*-----------------------------------------------------------------------------*/
|
||||
static void generic_adjust_link(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
struct phy_device *phydev = fep->phydev;
|
||||
int new_state = 0;
|
||||
|
||||
if (phydev->link) {
|
||||
|
||||
/* adjust to duplex mode */
|
||||
if (phydev->duplex != fep->oldduplex){
|
||||
new_state = 1;
|
||||
fep->oldduplex = phydev->duplex;
|
||||
}
|
||||
|
||||
if (phydev->speed != fep->oldspeed) {
|
||||
new_state = 1;
|
||||
fep->oldspeed = phydev->speed;
|
||||
}
|
||||
|
||||
if (!fep->oldlink) {
|
||||
new_state = 1;
|
||||
fep->oldlink = 1;
|
||||
netif_schedule(dev);
|
||||
netif_carrier_on(dev);
|
||||
netif_start_queue(dev);
|
||||
}
|
||||
|
||||
if (new_state)
|
||||
fep->ops->restart(dev);
|
||||
|
||||
} else if (fep->oldlink) {
|
||||
new_state = 1;
|
||||
fep->oldlink = 0;
|
||||
fep->oldspeed = 0;
|
||||
fep->oldduplex = -1;
|
||||
netif_carrier_off(dev);
|
||||
netif_stop_queue(dev);
|
||||
}
|
||||
|
||||
if (new_state && netif_msg_link(fep))
|
||||
phy_print_status(phydev);
|
||||
}
|
||||
|
||||
|
||||
static void fs_adjust_link(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
|
||||
if(fep->ops->adjust_link)
|
||||
fep->ops->adjust_link(dev);
|
||||
else
|
||||
generic_adjust_link(dev);
|
||||
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
}
|
||||
|
||||
static int fs_init_phy(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
struct phy_device *phydev;
|
||||
|
||||
fep->oldlink = 0;
|
||||
fep->oldspeed = 0;
|
||||
fep->oldduplex = -1;
|
||||
if(fep->fpi->bus_id)
|
||||
phydev = phy_connect(dev, fep->fpi->bus_id, &fs_adjust_link, 0);
|
||||
else {
|
||||
printk("No phy bus ID specified in BSP code\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (IS_ERR(phydev)) {
|
||||
printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
|
||||
return PTR_ERR(phydev);
|
||||
}
|
||||
|
||||
fep->phydev = phydev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int fs_enet_open(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
const struct fs_platform_info *fpi = fep->fpi;
|
||||
int r;
|
||||
int err;
|
||||
|
||||
/* Install our interrupt handler. */
|
||||
r = fs_request_irq(dev, fep->interrupt, "fs_enet-mac", fs_enet_interrupt);
|
||||
if (r != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s Could not allocate FEC IRQ!", dev->name);
|
||||
": %s Could not allocate FS_ENET IRQ!", dev->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Install our phy interrupt handler */
|
||||
if (fpi->phy_irq != -1) {
|
||||
err = fs_init_phy(dev);
|
||||
if(err)
|
||||
return err;
|
||||
|
||||
r = fs_request_irq(dev, fpi->phy_irq, "fs_enet-phy", fs_mii_link_interrupt);
|
||||
if (r != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s Could not allocate PHY IRQ!", dev->name);
|
||||
fs_free_irq(dev, fep->interrupt);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
fs_mii_startup(dev);
|
||||
netif_carrier_off(dev);
|
||||
fs_mii_link_status_change_check(dev, 1);
|
||||
phy_start(fep->phydev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -769,20 +821,19 @@ static int fs_enet_open(struct net_device *dev)
|
||||
static int fs_enet_close(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
const struct fs_platform_info *fpi = fep->fpi;
|
||||
unsigned long flags;
|
||||
|
||||
netif_stop_queue(dev);
|
||||
netif_carrier_off(dev);
|
||||
fs_mii_shutdown(dev);
|
||||
phy_stop(fep->phydev);
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
(*fep->ops->stop)(dev);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
|
||||
/* release any irqs */
|
||||
if (fpi->phy_irq != -1)
|
||||
fs_free_irq(dev, fpi->phy_irq);
|
||||
phy_disconnect(fep->phydev);
|
||||
fep->phydev = NULL;
|
||||
fs_free_irq(dev, fep->interrupt);
|
||||
|
||||
return 0;
|
||||
@@ -830,33 +881,19 @@ static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
||||
static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
rc = mii_ethtool_gset(&fep->mii_if, cmd);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
|
||||
return rc;
|
||||
return phy_ethtool_gset(fep->phydev, cmd);
|
||||
}
|
||||
|
||||
static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
rc = mii_ethtool_sset(&fep->mii_if, cmd);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
|
||||
return rc;
|
||||
phy_ethtool_sset(fep->phydev, cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fs_nway_reset(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
return mii_nway_restart(&fep->mii_if);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 fs_get_msglevel(struct net_device *dev)
|
||||
@@ -898,7 +935,7 @@ static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
rc = generic_mii_ioctl(&fep->mii_if, mii, cmd, NULL);
|
||||
rc = phy_mii_ioctl(fep->phydev, mii, cmd);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
return rc;
|
||||
}
|
||||
@@ -1030,12 +1067,6 @@ static struct net_device *fs_init_instance(struct device *dev,
|
||||
}
|
||||
registered = 1;
|
||||
|
||||
err = fs_mii_connect(ndev);
|
||||
if (err != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s fs_mii_connect failed.\n", ndev->name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
return ndev;
|
||||
|
||||
@@ -1073,8 +1104,6 @@ static int fs_cleanup_instance(struct net_device *ndev)
|
||||
|
||||
fpi = fep->fpi;
|
||||
|
||||
fs_mii_disconnect(ndev);
|
||||
|
||||
unregister_netdev(ndev);
|
||||
|
||||
dma_free_coherent(fep->dev, (fpi->tx_ring + fpi->rx_ring) * sizeof(cbd_t),
|
||||
@@ -1196,17 +1225,39 @@ static int __init fs_init(void)
|
||||
r = setup_immap();
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = driver_register(&fs_enet_fec_driver);
|
||||
if (r != 0)
|
||||
goto err;
|
||||
|
||||
#ifdef CONFIG_FS_ENET_HAS_FCC
|
||||
/* let's insert mii stuff */
|
||||
r = fs_enet_mdio_bb_init();
|
||||
|
||||
if (r != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
"BB PHY init failed.\n");
|
||||
return r;
|
||||
}
|
||||
r = driver_register(&fs_enet_fcc_driver);
|
||||
if (r != 0)
|
||||
goto err;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_ENET_HAS_FEC
|
||||
r = fs_enet_mdio_fec_init();
|
||||
if (r != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
"FEC PHY init failed.\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
r = driver_register(&fs_enet_fec_driver);
|
||||
if (r != 0)
|
||||
goto err;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_ENET_HAS_SCC
|
||||
r = driver_register(&fs_enet_scc_driver);
|
||||
if (r != 0)
|
||||
goto err;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
||||
@@ -1,505 +0,0 @@
|
||||
/*
|
||||
* Combined Ethernet driver for Motorola MPC8xx and MPC82xx.
|
||||
*
|
||||
* Copyright (c) 2003 Intracom S.A.
|
||||
* by Pantelis Antoniou <panto@intracom.gr>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc.
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* Heavily based on original FEC driver by Dan Malek <dan@embeddededge.com>
|
||||
* and modifications by Joakim Tjernlund <joakim.tjernlund@lumentis.se>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "fs_enet.h"
|
||||
|
||||
/*************************************************/
|
||||
|
||||
/*
|
||||
* Generic PHY support.
|
||||
* Should work for all PHYs, but link change is detected by polling
|
||||
*/
|
||||
|
||||
static void generic_timer_callback(unsigned long data)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)data;
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
fep->phy_timer_list.expires = jiffies + HZ / 2;
|
||||
|
||||
add_timer(&fep->phy_timer_list);
|
||||
|
||||
fs_mii_link_status_change_check(dev, 0);
|
||||
}
|
||||
|
||||
static void generic_startup(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
fep->phy_timer_list.expires = jiffies + HZ / 2; /* every 500ms */
|
||||
fep->phy_timer_list.data = (unsigned long)dev;
|
||||
fep->phy_timer_list.function = generic_timer_callback;
|
||||
add_timer(&fep->phy_timer_list);
|
||||
}
|
||||
|
||||
static void generic_shutdown(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
del_timer_sync(&fep->phy_timer_list);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* The Davicom DM9161 is used on the NETTA board */
|
||||
|
||||
/* register definitions */
|
||||
|
||||
#define MII_DM9161_ANAR 4 /* Aux. Config Register */
|
||||
#define MII_DM9161_ACR 16 /* Aux. Config Register */
|
||||
#define MII_DM9161_ACSR 17 /* Aux. Config/Status Register */
|
||||
#define MII_DM9161_10TCSR 18 /* 10BaseT Config/Status Reg. */
|
||||
#define MII_DM9161_INTR 21 /* Interrupt Register */
|
||||
#define MII_DM9161_RECR 22 /* Receive Error Counter Reg. */
|
||||
#define MII_DM9161_DISCR 23 /* Disconnect Counter Register */
|
||||
|
||||
static void dm9161_startup(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
fs_mii_write(dev, fep->mii_if.phy_id, MII_DM9161_INTR, 0x0000);
|
||||
/* Start autonegotiation */
|
||||
fs_mii_write(dev, fep->mii_if.phy_id, MII_BMCR, 0x1200);
|
||||
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule_timeout(HZ*8);
|
||||
}
|
||||
|
||||
static void dm9161_ack_int(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
fs_mii_read(dev, fep->mii_if.phy_id, MII_DM9161_INTR);
|
||||
}
|
||||
|
||||
static void dm9161_shutdown(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
fs_mii_write(dev, fep->mii_if.phy_id, MII_DM9161_INTR, 0x0f00);
|
||||
}
|
||||
|
||||
/**********************************************************************************/
|
||||
|
||||
static const struct phy_info phy_info[] = {
|
||||
{
|
||||
.id = 0x00181b88,
|
||||
.name = "DM9161",
|
||||
.startup = dm9161_startup,
|
||||
.ack_int = dm9161_ack_int,
|
||||
.shutdown = dm9161_shutdown,
|
||||
}, {
|
||||
.id = 0,
|
||||
.name = "GENERIC",
|
||||
.startup = generic_startup,
|
||||
.shutdown = generic_shutdown,
|
||||
},
|
||||
};
|
||||
|
||||
/**********************************************************************************/
|
||||
|
||||
static int phy_id_detect(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
const struct fs_platform_info *fpi = fep->fpi;
|
||||
struct fs_enet_mii_bus *bus = fep->mii_bus;
|
||||
int i, r, start, end, phytype, physubtype;
|
||||
const struct phy_info *phy;
|
||||
int phy_hwid, phy_id;
|
||||
|
||||
phy_hwid = -1;
|
||||
fep->phy = NULL;
|
||||
|
||||
/* auto-detect? */
|
||||
if (fpi->phy_addr == -1) {
|
||||
start = 1;
|
||||
end = 32;
|
||||
} else { /* direct */
|
||||
start = fpi->phy_addr;
|
||||
end = start + 1;
|
||||
}
|
||||
|
||||
for (phy_id = start; phy_id < end; phy_id++) {
|
||||
/* skip already used phy addresses on this bus */
|
||||
if (bus->usage_map & (1 << phy_id))
|
||||
continue;
|
||||
r = fs_mii_read(dev, phy_id, MII_PHYSID1);
|
||||
if (r == -1 || (phytype = (r & 0xffff)) == 0xffff)
|
||||
continue;
|
||||
r = fs_mii_read(dev, phy_id, MII_PHYSID2);
|
||||
if (r == -1 || (physubtype = (r & 0xffff)) == 0xffff)
|
||||
continue;
|
||||
phy_hwid = (phytype << 16) | physubtype;
|
||||
if (phy_hwid != -1)
|
||||
break;
|
||||
}
|
||||
|
||||
if (phy_hwid == -1) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s No PHY detected! range=0x%02x-0x%02x\n",
|
||||
dev->name, start, end);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0, phy = phy_info; i < ARRAY_SIZE(phy_info); i++, phy++)
|
||||
if (phy->id == (phy_hwid >> 4) || phy->id == 0)
|
||||
break;
|
||||
|
||||
if (i >= ARRAY_SIZE(phy_info)) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s PHY id 0x%08x is not supported!\n",
|
||||
dev->name, phy_hwid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fep->phy = phy;
|
||||
|
||||
/* mark this address as used */
|
||||
bus->usage_map |= (1 << phy_id);
|
||||
|
||||
printk(KERN_INFO DRV_MODULE_NAME
|
||||
": %s Phy @ 0x%x, type %s (0x%08x)%s\n",
|
||||
dev->name, phy_id, fep->phy->name, phy_hwid,
|
||||
fpi->phy_addr == -1 ? " (auto-detected)" : "");
|
||||
|
||||
return phy_id;
|
||||
}
|
||||
|
||||
void fs_mii_startup(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
if (fep->phy->startup)
|
||||
(*fep->phy->startup) (dev);
|
||||
}
|
||||
|
||||
void fs_mii_shutdown(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
if (fep->phy->shutdown)
|
||||
(*fep->phy->shutdown) (dev);
|
||||
}
|
||||
|
||||
void fs_mii_ack_int(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
|
||||
if (fep->phy->ack_int)
|
||||
(*fep->phy->ack_int) (dev);
|
||||
}
|
||||
|
||||
#define MII_LINK 0x0001
|
||||
#define MII_HALF 0x0002
|
||||
#define MII_FULL 0x0004
|
||||
#define MII_BASE4 0x0008
|
||||
#define MII_10M 0x0010
|
||||
#define MII_100M 0x0020
|
||||
#define MII_1G 0x0040
|
||||
#define MII_10G 0x0080
|
||||
|
||||
/* return full mii info at one gulp, with a usable form */
|
||||
static unsigned int mii_full_status(struct mii_if_info *mii)
|
||||
{
|
||||
unsigned int status;
|
||||
int bmsr, adv, lpa, neg;
|
||||
struct fs_enet_private* fep = netdev_priv(mii->dev);
|
||||
|
||||
/* first, a dummy read, needed to latch some MII phys */
|
||||
(void)mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR);
|
||||
bmsr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR);
|
||||
|
||||
/* no link */
|
||||
if ((bmsr & BMSR_LSTATUS) == 0)
|
||||
return 0;
|
||||
|
||||
status = MII_LINK;
|
||||
|
||||
/* Lets look what ANEG says if it's supported - otherwize we shall
|
||||
take the right values from the platform info*/
|
||||
if(!mii->force_media) {
|
||||
/* autoneg not completed; don't bother */
|
||||
if ((bmsr & BMSR_ANEGCOMPLETE) == 0)
|
||||
return 0;
|
||||
|
||||
adv = (*mii->mdio_read)(mii->dev, mii->phy_id, MII_ADVERTISE);
|
||||
lpa = (*mii->mdio_read)(mii->dev, mii->phy_id, MII_LPA);
|
||||
|
||||
neg = lpa & adv;
|
||||
} else {
|
||||
neg = fep->fpi->bus_info->lpa;
|
||||
}
|
||||
|
||||
if (neg & LPA_100FULL)
|
||||
status |= MII_FULL | MII_100M;
|
||||
else if (neg & LPA_100BASE4)
|
||||
status |= MII_FULL | MII_BASE4 | MII_100M;
|
||||
else if (neg & LPA_100HALF)
|
||||
status |= MII_HALF | MII_100M;
|
||||
else if (neg & LPA_10FULL)
|
||||
status |= MII_FULL | MII_10M;
|
||||
else
|
||||
status |= MII_HALF | MII_10M;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void fs_mii_link_status_change_check(struct net_device *dev, int init_media)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
struct mii_if_info *mii = &fep->mii_if;
|
||||
unsigned int mii_status;
|
||||
int ok_to_print, link, duplex, speed;
|
||||
unsigned long flags;
|
||||
|
||||
ok_to_print = netif_msg_link(fep);
|
||||
|
||||
mii_status = mii_full_status(mii);
|
||||
|
||||
if (!init_media && mii_status == fep->last_mii_status)
|
||||
return;
|
||||
|
||||
fep->last_mii_status = mii_status;
|
||||
|
||||
link = !!(mii_status & MII_LINK);
|
||||
duplex = !!(mii_status & MII_FULL);
|
||||
speed = (mii_status & MII_100M) ? 100 : 10;
|
||||
|
||||
if (link == 0) {
|
||||
netif_carrier_off(mii->dev);
|
||||
netif_stop_queue(dev);
|
||||
if (!init_media) {
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
(*fep->ops->stop)(dev);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
}
|
||||
|
||||
if (ok_to_print)
|
||||
printk(KERN_INFO "%s: link down\n", mii->dev->name);
|
||||
|
||||
} else {
|
||||
|
||||
mii->full_duplex = duplex;
|
||||
|
||||
netif_carrier_on(mii->dev);
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
fep->duplex = duplex;
|
||||
fep->speed = speed;
|
||||
(*fep->ops->restart)(dev);
|
||||
spin_unlock_irqrestore(&fep->lock, flags);
|
||||
|
||||
netif_start_queue(dev);
|
||||
|
||||
if (ok_to_print)
|
||||
printk(KERN_INFO "%s: link up, %dMbps, %s-duplex\n",
|
||||
dev->name, speed, duplex ? "full" : "half");
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************************/
|
||||
|
||||
int fs_mii_read(struct net_device *dev, int phy_id, int location)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
struct fs_enet_mii_bus *bus = fep->mii_bus;
|
||||
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&bus->mii_lock, flags);
|
||||
ret = (*bus->mii_read)(bus, phy_id, location);
|
||||
spin_unlock_irqrestore(&bus->mii_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void fs_mii_write(struct net_device *dev, int phy_id, int location, int value)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
struct fs_enet_mii_bus *bus = fep->mii_bus;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bus->mii_lock, flags);
|
||||
(*bus->mii_write)(bus, phy_id, location, value);
|
||||
spin_unlock_irqrestore(&bus->mii_lock, flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* list of all registered mii buses */
|
||||
static LIST_HEAD(fs_mii_bus_list);
|
||||
|
||||
static struct fs_enet_mii_bus *lookup_bus(int method, int id)
|
||||
{
|
||||
struct list_head *ptr;
|
||||
struct fs_enet_mii_bus *bus;
|
||||
|
||||
list_for_each(ptr, &fs_mii_bus_list) {
|
||||
bus = list_entry(ptr, struct fs_enet_mii_bus, list);
|
||||
if (bus->bus_info->method == method &&
|
||||
bus->bus_info->id == id)
|
||||
return bus;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct fs_enet_mii_bus *create_bus(const struct fs_mii_bus_info *bi)
|
||||
{
|
||||
struct fs_enet_mii_bus *bus;
|
||||
int ret = 0;
|
||||
|
||||
bus = kmalloc(sizeof(*bus), GFP_KERNEL);
|
||||
if (bus == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
memset(bus, 0, sizeof(*bus));
|
||||
spin_lock_init(&bus->mii_lock);
|
||||
bus->bus_info = bi;
|
||||
bus->refs = 0;
|
||||
bus->usage_map = 0;
|
||||
|
||||
/* perform initialization */
|
||||
switch (bi->method) {
|
||||
|
||||
case fsmii_fixed:
|
||||
ret = fs_mii_fixed_init(bus);
|
||||
if (ret != 0)
|
||||
goto err;
|
||||
break;
|
||||
|
||||
case fsmii_bitbang:
|
||||
ret = fs_mii_bitbang_init(bus);
|
||||
if (ret != 0)
|
||||
goto err;
|
||||
break;
|
||||
#ifdef CONFIG_FS_ENET_HAS_FEC
|
||||
case fsmii_fec:
|
||||
ret = fs_mii_fec_init(bus);
|
||||
if (ret != 0)
|
||||
goto err;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
list_add(&bus->list, &fs_mii_bus_list);
|
||||
|
||||
return bus;
|
||||
|
||||
err:
|
||||
kfree(bus);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static void destroy_bus(struct fs_enet_mii_bus *bus)
|
||||
{
|
||||
/* remove from bus list */
|
||||
list_del(&bus->list);
|
||||
|
||||
/* nothing more needed */
|
||||
kfree(bus);
|
||||
}
|
||||
|
||||
int fs_mii_connect(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
const struct fs_platform_info *fpi = fep->fpi;
|
||||
struct fs_enet_mii_bus *bus = NULL;
|
||||
|
||||
/* check method validity */
|
||||
switch (fpi->bus_info->method) {
|
||||
case fsmii_fixed:
|
||||
case fsmii_bitbang:
|
||||
break;
|
||||
#ifdef CONFIG_FS_ENET_HAS_FEC
|
||||
case fsmii_fec:
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s Unknown MII bus method (%d)!\n",
|
||||
dev->name, fpi->bus_info->method);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bus = lookup_bus(fpi->bus_info->method, fpi->bus_info->id);
|
||||
|
||||
/* if not found create new bus */
|
||||
if (bus == NULL) {
|
||||
bus = create_bus(fpi->bus_info);
|
||||
if (IS_ERR(bus)) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s MII bus creation failure!\n", dev->name);
|
||||
return PTR_ERR(bus);
|
||||
}
|
||||
}
|
||||
|
||||
bus->refs++;
|
||||
|
||||
fep->mii_bus = bus;
|
||||
|
||||
fep->mii_if.dev = dev;
|
||||
fep->mii_if.phy_id_mask = 0x1f;
|
||||
fep->mii_if.reg_num_mask = 0x1f;
|
||||
fep->mii_if.mdio_read = fs_mii_read;
|
||||
fep->mii_if.mdio_write = fs_mii_write;
|
||||
fep->mii_if.force_media = fpi->bus_info->disable_aneg;
|
||||
fep->mii_if.phy_id = phy_id_detect(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fs_mii_disconnect(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
struct fs_enet_mii_bus *bus = NULL;
|
||||
|
||||
bus = fep->mii_bus;
|
||||
fep->mii_bus = NULL;
|
||||
|
||||
if (--bus->refs <= 0)
|
||||
destroy_bus(bus);
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <linux/fs_enet_pd.h>
|
||||
|
||||
@@ -12,12 +13,30 @@
|
||||
|
||||
#ifdef CONFIG_CPM1
|
||||
#include <asm/commproc.h>
|
||||
|
||||
struct fec_info {
|
||||
fec_t* fecp;
|
||||
u32 mii_speed;
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPM2
|
||||
#include <asm/cpm2.h>
|
||||
#endif
|
||||
|
||||
/* This is used to operate with pins.
|
||||
Note that the actual port size may
|
||||
be different; cpm(s) handle it OK */
|
||||
struct bb_info {
|
||||
u8 mdio_dat_msk;
|
||||
u8 mdio_dir_msk;
|
||||
u8 *mdio_dir;
|
||||
u8 *mdio_dat;
|
||||
u8 mdc_msk;
|
||||
u8 *mdc_dat;
|
||||
int delay;
|
||||
};
|
||||
|
||||
/* hw driver ops */
|
||||
struct fs_ops {
|
||||
int (*setup_data)(struct net_device *dev);
|
||||
@@ -25,6 +44,7 @@ struct fs_ops {
|
||||
void (*free_bd)(struct net_device *dev);
|
||||
void (*cleanup_data)(struct net_device *dev);
|
||||
void (*set_multicast_list)(struct net_device *dev);
|
||||
void (*adjust_link)(struct net_device *dev);
|
||||
void (*restart)(struct net_device *dev);
|
||||
void (*stop)(struct net_device *dev);
|
||||
void (*pre_request_irq)(struct net_device *dev, int irq);
|
||||
@@ -100,10 +120,6 @@ struct fs_enet_mii_bus {
|
||||
};
|
||||
};
|
||||
|
||||
int fs_mii_bitbang_init(struct fs_enet_mii_bus *bus);
|
||||
int fs_mii_fixed_init(struct fs_enet_mii_bus *bus);
|
||||
int fs_mii_fec_init(struct fs_enet_mii_bus *bus);
|
||||
|
||||
struct fs_enet_private {
|
||||
struct device *dev; /* pointer back to the device (must be initialized first) */
|
||||
spinlock_t lock; /* during all ops except TX pckt processing */
|
||||
@@ -130,7 +146,8 @@ struct fs_enet_private {
|
||||
struct fs_enet_mii_bus *mii_bus;
|
||||
int interrupt;
|
||||
|
||||
int duplex, speed; /* current settings */
|
||||
struct phy_device *phydev;
|
||||
int oldduplex, oldspeed, oldlink; /* current settings */
|
||||
|
||||
/* event masks */
|
||||
u32 ev_napi_rx; /* mask of NAPI rx events */
|
||||
@@ -168,15 +185,9 @@ struct fs_enet_private {
|
||||
};
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
int fs_mii_read(struct net_device *dev, int phy_id, int location);
|
||||
void fs_mii_write(struct net_device *dev, int phy_id, int location, int value);
|
||||
|
||||
void fs_mii_startup(struct net_device *dev);
|
||||
void fs_mii_shutdown(struct net_device *dev);
|
||||
void fs_mii_ack_int(struct net_device *dev);
|
||||
|
||||
void fs_mii_link_status_change_check(struct net_device *dev, int init_media);
|
||||
int fs_enet_mdio_bb_init(void);
|
||||
int fs_mii_fixed_init(struct fs_enet_mii_bus *bus);
|
||||
int fs_enet_mdio_fec_init(void);
|
||||
|
||||
void fs_init_bds(struct net_device *dev);
|
||||
void fs_cleanup_bds(struct net_device *dev);
|
||||
@@ -194,7 +205,6 @@ int fs_enet_platform_init(void);
|
||||
void fs_enet_platform_cleanup(void);
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* buffer descriptor access macros */
|
||||
|
||||
/* access macros */
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include <asm/immap_cpm2.h>
|
||||
#include <asm/mpc8260.h>
|
||||
@@ -122,22 +123,32 @@ static int do_pd_setup(struct fs_enet_private *fep)
|
||||
|
||||
/* Attach the memory for the FCC Parameter RAM */
|
||||
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_pram");
|
||||
fep->fcc.ep = (void *)r->start;
|
||||
|
||||
fep->fcc.ep = (void *)ioremap(r->start, r->end - r->start + 1);
|
||||
if (fep->fcc.ep == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_regs");
|
||||
fep->fcc.fccp = (void *)r->start;
|
||||
|
||||
fep->fcc.fccp = (void *)ioremap(r->start, r->end - r->start + 1);
|
||||
if (fep->fcc.fccp == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
fep->fcc.fcccp = (void *)fep->fpi->fcc_regs_c;
|
||||
if (fep->fpi->fcc_regs_c) {
|
||||
|
||||
fep->fcc.fcccp = (void *)fep->fpi->fcc_regs_c;
|
||||
} else {
|
||||
r = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
"fcc_regs_c");
|
||||
fep->fcc.fcccp = (void *)ioremap(r->start,
|
||||
r->end - r->start + 1);
|
||||
}
|
||||
|
||||
if (fep->fcc.fcccp == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
fep->fcc.mem = (void *)fep->fpi->mem_offset;
|
||||
if (fep->fcc.mem == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -155,8 +166,6 @@ static int setup_data(struct net_device *dev)
|
||||
if ((unsigned int)fep->fcc.idx >= 3) /* max 3 FCCs */
|
||||
return -EINVAL;
|
||||
|
||||
fep->fcc.mem = (void *)fpi->mem_offset;
|
||||
|
||||
if (do_pd_setup(fep) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -394,7 +403,7 @@ static void restart(struct net_device *dev)
|
||||
|
||||
/* adjust to speed (for RMII mode) */
|
||||
if (fpi->use_rmii) {
|
||||
if (fep->speed == 100)
|
||||
if (fep->phydev->speed == 100)
|
||||
C8(fcccp, fcc_gfemr, 0x20);
|
||||
else
|
||||
S8(fcccp, fcc_gfemr, 0x20);
|
||||
@@ -420,7 +429,7 @@ static void restart(struct net_device *dev)
|
||||
S32(fccp, fcc_fpsmr, FCC_PSMR_RMII);
|
||||
|
||||
/* adjust to duplex mode */
|
||||
if (fep->duplex)
|
||||
if (fep->phydev->duplex)
|
||||
S32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB);
|
||||
else
|
||||
C32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB);
|
||||
@@ -486,7 +495,10 @@ static void rx_bd_done(struct net_device *dev)
|
||||
|
||||
static void tx_kickstart(struct net_device *dev)
|
||||
{
|
||||
/* nothing */
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
fcc_t *fccp = fep->fcc.fccp;
|
||||
|
||||
S32(fccp, fcc_ftodr, 0x80);
|
||||
}
|
||||
|
||||
static u32 get_int_events(struct net_device *dev)
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#endif
|
||||
|
||||
#include "fs_enet.h"
|
||||
#include "fec.h"
|
||||
|
||||
/*************************************************/
|
||||
|
||||
@@ -75,50 +76,8 @@
|
||||
/* clear bits */
|
||||
#define FC(_fecp, _reg, _v) FW(_fecp, _reg, FR(_fecp, _reg) & ~(_v))
|
||||
|
||||
|
||||
/* CRC polynomium used by the FEC for the multicast group filtering */
|
||||
#define FEC_CRC_POLY 0x04C11DB7
|
||||
|
||||
#define FEC_MAX_MULTICAST_ADDRS 64
|
||||
|
||||
/* Interrupt events/masks.
|
||||
*/
|
||||
#define FEC_ENET_HBERR 0x80000000U /* Heartbeat error */
|
||||
#define FEC_ENET_BABR 0x40000000U /* Babbling receiver */
|
||||
#define FEC_ENET_BABT 0x20000000U /* Babbling transmitter */
|
||||
#define FEC_ENET_GRA 0x10000000U /* Graceful stop complete */
|
||||
#define FEC_ENET_TXF 0x08000000U /* Full frame transmitted */
|
||||
#define FEC_ENET_TXB 0x04000000U /* A buffer was transmitted */
|
||||
#define FEC_ENET_RXF 0x02000000U /* Full frame received */
|
||||
#define FEC_ENET_RXB 0x01000000U /* A buffer was received */
|
||||
#define FEC_ENET_MII 0x00800000U /* MII interrupt */
|
||||
#define FEC_ENET_EBERR 0x00400000U /* SDMA bus error */
|
||||
|
||||
#define FEC_ECNTRL_PINMUX 0x00000004
|
||||
#define FEC_ECNTRL_ETHER_EN 0x00000002
|
||||
#define FEC_ECNTRL_RESET 0x00000001
|
||||
|
||||
#define FEC_RCNTRL_BC_REJ 0x00000010
|
||||
#define FEC_RCNTRL_PROM 0x00000008
|
||||
#define FEC_RCNTRL_MII_MODE 0x00000004
|
||||
#define FEC_RCNTRL_DRT 0x00000002
|
||||
#define FEC_RCNTRL_LOOP 0x00000001
|
||||
|
||||
#define FEC_TCNTRL_FDEN 0x00000004
|
||||
#define FEC_TCNTRL_HBC 0x00000002
|
||||
#define FEC_TCNTRL_GTS 0x00000001
|
||||
|
||||
|
||||
/* Make MII read/write commands for the FEC.
|
||||
*/
|
||||
#define mk_mii_read(REG) (0x60020000 | ((REG & 0x1f) << 18))
|
||||
#define mk_mii_write(REG, VAL) (0x50020000 | ((REG & 0x1f) << 18) | (VAL & 0xffff))
|
||||
#define mk_mii_end 0
|
||||
|
||||
#define FEC_MII_LOOPS 10000
|
||||
|
||||
/*
|
||||
* Delay to wait for FEC reset command to complete (in us)
|
||||
* Delay to wait for FEC reset command to complete (in us)
|
||||
*/
|
||||
#define FEC_RESET_DELAY 50
|
||||
|
||||
@@ -303,13 +262,15 @@ static void restart(struct net_device *dev)
|
||||
int r;
|
||||
u32 addrhi, addrlo;
|
||||
|
||||
struct mii_bus* mii = fep->phydev->bus;
|
||||
struct fec_info* fec_inf = mii->priv;
|
||||
|
||||
r = whack_reset(fep->fec.fecp);
|
||||
if (r != 0)
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
": %s FEC Reset FAILED!\n", dev->name);
|
||||
|
||||
/*
|
||||
* Set station address.
|
||||
* Set station address.
|
||||
*/
|
||||
addrhi = ((u32) dev->dev_addr[0] << 24) |
|
||||
((u32) dev->dev_addr[1] << 16) |
|
||||
@@ -350,12 +311,12 @@ static void restart(struct net_device *dev)
|
||||
FW(fecp, fun_code, 0x78000000);
|
||||
|
||||
/*
|
||||
* Set MII speed.
|
||||
* Set MII speed.
|
||||
*/
|
||||
FW(fecp, mii_speed, fep->mii_bus->fec.mii_speed);
|
||||
FW(fecp, mii_speed, fec_inf->mii_speed);
|
||||
|
||||
/*
|
||||
* Clear any outstanding interrupt.
|
||||
* Clear any outstanding interrupt.
|
||||
*/
|
||||
FW(fecp, ievent, 0xffc0);
|
||||
FW(fecp, ivec, (fep->interrupt / 2) << 29);
|
||||
@@ -390,11 +351,12 @@ static void restart(struct net_device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
FW(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */
|
||||
/*
|
||||
* adjust to duplex mode
|
||||
* adjust to duplex mode
|
||||
*/
|
||||
if (fep->duplex) {
|
||||
if (fep->phydev->duplex) {
|
||||
FC(fecp, r_cntrl, FEC_RCNTRL_DRT);
|
||||
FS(fecp, x_cntrl, FEC_TCNTRL_FDEN); /* FD enable */
|
||||
} else {
|
||||
@@ -418,9 +380,11 @@ static void restart(struct net_device *dev)
|
||||
static void stop(struct net_device *dev)
|
||||
{
|
||||
struct fs_enet_private *fep = netdev_priv(dev);
|
||||
const struct fs_platform_info *fpi = fep->fpi;
|
||||
fec_t *fecp = fep->fec.fecp;
|
||||
struct fs_enet_mii_bus *bus = fep->mii_bus;
|
||||
const struct fs_mii_bus_info *bi = bus->bus_info;
|
||||
|
||||
struct fec_info* feci= fep->phydev->bus->priv;
|
||||
|
||||
int i;
|
||||
|
||||
if ((FR(fecp, ecntrl) & FEC_ECNTRL_ETHER_EN) == 0)
|
||||
@@ -444,11 +408,11 @@ static void stop(struct net_device *dev)
|
||||
fs_cleanup_bds(dev);
|
||||
|
||||
/* shut down FEC1? that's where the mii bus is */
|
||||
if (fep->fec.idx == 0 && bus->refs > 1 && bi->method == fsmii_fec) {
|
||||
if (fpi->has_phy) {
|
||||
FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */
|
||||
FS(fecp, ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN);
|
||||
FW(fecp, ievent, FEC_ENET_MII);
|
||||
FW(fecp, mii_speed, bus->fec.mii_speed);
|
||||
FW(fecp, mii_speed, feci->mii_speed);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -583,73 +547,3 @@ const struct fs_ops fs_fec_ops = {
|
||||
.free_bd = free_bd,
|
||||
};
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
static int mii_read(struct fs_enet_mii_bus *bus, int phy_id, int location)
|
||||
{
|
||||
fec_t *fecp = bus->fec.fecp;
|
||||
int i, ret = -1;
|
||||
|
||||
if ((FR(fecp, r_cntrl) & FEC_RCNTRL_MII_MODE) == 0)
|
||||
BUG();
|
||||
|
||||
/* Add PHY address to register command. */
|
||||
FW(fecp, mii_data, (phy_id << 23) | mk_mii_read(location));
|
||||
|
||||
for (i = 0; i < FEC_MII_LOOPS; i++)
|
||||
if ((FR(fecp, ievent) & FEC_ENET_MII) != 0)
|
||||
break;
|
||||
|
||||
if (i < FEC_MII_LOOPS) {
|
||||
FW(fecp, ievent, FEC_ENET_MII);
|
||||
ret = FR(fecp, mii_data) & 0xffff;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int value)
|
||||
{
|
||||
fec_t *fecp = bus->fec.fecp;
|
||||
int i;
|
||||
|
||||
/* this must never happen */
|
||||
if ((FR(fecp, r_cntrl) & FEC_RCNTRL_MII_MODE) == 0)
|
||||
BUG();
|
||||
|
||||
/* Add PHY address to register command. */
|
||||
FW(fecp, mii_data, (phy_id << 23) | mk_mii_write(location, value));
|
||||
|
||||
for (i = 0; i < FEC_MII_LOOPS; i++)
|
||||
if ((FR(fecp, ievent) & FEC_ENET_MII) != 0)
|
||||
break;
|
||||
|
||||
if (i < FEC_MII_LOOPS)
|
||||
FW(fecp, ievent, FEC_ENET_MII);
|
||||
}
|
||||
|
||||
int fs_mii_fec_init(struct fs_enet_mii_bus *bus)
|
||||
{
|
||||
bd_t *bd = (bd_t *)__res;
|
||||
const struct fs_mii_bus_info *bi = bus->bus_info;
|
||||
fec_t *fecp;
|
||||
|
||||
if (bi->id != 0)
|
||||
return -1;
|
||||
|
||||
bus->fec.fecp = &((immap_t *)fs_enet_immap)->im_cpm.cp_fec;
|
||||
bus->fec.mii_speed = ((((bd->bi_intfreq + 4999999) / 2500000) / 2)
|
||||
& 0x3F) << 1;
|
||||
|
||||
fecp = bus->fec.fecp;
|
||||
|
||||
FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */
|
||||
FS(fecp, ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN);
|
||||
FW(fecp, ievent, FEC_ENET_MII);
|
||||
FW(fecp, mii_speed, bus->fec.mii_speed);
|
||||
|
||||
bus->mii_read = mii_read;
|
||||
bus->mii_write = mii_write;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -369,7 +369,7 @@ static void restart(struct net_device *dev)
|
||||
W16(sccp, scc_psmr, SCC_PSMR_ENCRC | SCC_PSMR_NIB22);
|
||||
|
||||
/* Set full duplex mode if needed */
|
||||
if (fep->duplex)
|
||||
if (fep->phydev->duplex)
|
||||
S16(sccp, scc_psmr, SCC_PSMR_LPB | SCC_PSMR_FDE);
|
||||
|
||||
S32(sccp, scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
|
||||
@@ -500,6 +500,8 @@ static void tx_restart(struct net_device *dev)
|
||||
scc_cr_cmd(fep, CPM_CR_RESTART_TX);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
const struct fs_ops fs_scc_ops = {
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/mii.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -40,129 +41,25 @@
|
||||
|
||||
#include "fs_enet.h"
|
||||
|
||||
#ifdef CONFIG_8xx
|
||||
static int bitbang_prep_bit(u8 **dirp, u8 **datp, u8 *mskp, int port, int bit)
|
||||
static int bitbang_prep_bit(u8 **datp, u8 *mskp,
|
||||
struct fs_mii_bit *mii_bit)
|
||||
{
|
||||
immap_t *im = (immap_t *)fs_enet_immap;
|
||||
void *dir, *dat, *ppar;
|
||||
void *dat;
|
||||
int adv;
|
||||
u8 msk;
|
||||
|
||||
switch (port) {
|
||||
case fsiop_porta:
|
||||
dir = &im->im_ioport.iop_padir;
|
||||
dat = &im->im_ioport.iop_padat;
|
||||
ppar = &im->im_ioport.iop_papar;
|
||||
break;
|
||||
dat = (void*) mii_bit->offset;
|
||||
|
||||
case fsiop_portb:
|
||||
dir = &im->im_cpm.cp_pbdir;
|
||||
dat = &im->im_cpm.cp_pbdat;
|
||||
ppar = &im->im_cpm.cp_pbpar;
|
||||
break;
|
||||
|
||||
case fsiop_portc:
|
||||
dir = &im->im_ioport.iop_pcdir;
|
||||
dat = &im->im_ioport.iop_pcdat;
|
||||
ppar = &im->im_ioport.iop_pcpar;
|
||||
break;
|
||||
|
||||
case fsiop_portd:
|
||||
dir = &im->im_ioport.iop_pddir;
|
||||
dat = &im->im_ioport.iop_pddat;
|
||||
ppar = &im->im_ioport.iop_pdpar;
|
||||
break;
|
||||
|
||||
case fsiop_porte:
|
||||
dir = &im->im_cpm.cp_pedir;
|
||||
dat = &im->im_cpm.cp_pedat;
|
||||
ppar = &im->im_cpm.cp_pepar;
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
"Illegal port value %d!\n", port);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
adv = bit >> 3;
|
||||
dir = (char *)dir + adv;
|
||||
adv = mii_bit->bit >> 3;
|
||||
dat = (char *)dat + adv;
|
||||
ppar = (char *)ppar + adv;
|
||||
|
||||
msk = 1 << (7 - (bit & 7));
|
||||
if ((in_8(ppar) & msk) != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
"pin %d on port %d is not general purpose!\n", bit, port);
|
||||
return -EINVAL;
|
||||
}
|
||||
msk = 1 << (7 - (mii_bit->bit & 7));
|
||||
|
||||
*dirp = dir;
|
||||
*datp = dat;
|
||||
*mskp = msk;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_8260
|
||||
static int bitbang_prep_bit(u8 **dirp, u8 **datp, u8 *mskp, int port, int bit)
|
||||
{
|
||||
iop_cpm2_t *io = &((cpm2_map_t *)fs_enet_immap)->im_ioport;
|
||||
void *dir, *dat, *ppar;
|
||||
int adv;
|
||||
u8 msk;
|
||||
|
||||
switch (port) {
|
||||
case fsiop_porta:
|
||||
dir = &io->iop_pdira;
|
||||
dat = &io->iop_pdata;
|
||||
ppar = &io->iop_ppara;
|
||||
break;
|
||||
|
||||
case fsiop_portb:
|
||||
dir = &io->iop_pdirb;
|
||||
dat = &io->iop_pdatb;
|
||||
ppar = &io->iop_pparb;
|
||||
break;
|
||||
|
||||
case fsiop_portc:
|
||||
dir = &io->iop_pdirc;
|
||||
dat = &io->iop_pdatc;
|
||||
ppar = &io->iop_pparc;
|
||||
break;
|
||||
|
||||
case fsiop_portd:
|
||||
dir = &io->iop_pdird;
|
||||
dat = &io->iop_pdatd;
|
||||
ppar = &io->iop_ppard;
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
"Illegal port value %d!\n", port);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
adv = bit >> 3;
|
||||
dir = (char *)dir + adv;
|
||||
dat = (char *)dat + adv;
|
||||
ppar = (char *)ppar + adv;
|
||||
|
||||
msk = 1 << (7 - (bit & 7));
|
||||
if ((in_8(ppar) & msk) != 0) {
|
||||
printk(KERN_ERR DRV_MODULE_NAME
|
||||
"pin %d on port %d is not general purpose!\n", bit, port);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*dirp = dir;
|
||||
*datp = dat;
|
||||
*mskp = msk;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void bb_set(u8 *p, u8 m)
|
||||
{
|
||||
@@ -179,44 +76,44 @@ static inline int bb_read(u8 *p, u8 m)
|
||||
return (in_8(p) & m) != 0;
|
||||
}
|
||||
|
||||
static inline void mdio_active(struct fs_enet_mii_bus *bus)
|
||||
static inline void mdio_active(struct bb_info *bitbang)
|
||||
{
|
||||
bb_set(bus->bitbang.mdio_dir, bus->bitbang.mdio_msk);
|
||||
bb_set(bitbang->mdio_dir, bitbang->mdio_dir_msk);
|
||||
}
|
||||
|
||||
static inline void mdio_tristate(struct fs_enet_mii_bus *bus)
|
||||
static inline void mdio_tristate(struct bb_info *bitbang )
|
||||
{
|
||||
bb_clr(bus->bitbang.mdio_dir, bus->bitbang.mdio_msk);
|
||||
bb_clr(bitbang->mdio_dir, bitbang->mdio_dir_msk);
|
||||
}
|
||||
|
||||
static inline int mdio_read(struct fs_enet_mii_bus *bus)
|
||||
static inline int mdio_read(struct bb_info *bitbang )
|
||||
{
|
||||
return bb_read(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk);
|
||||
return bb_read(bitbang->mdio_dat, bitbang->mdio_dat_msk);
|
||||
}
|
||||
|
||||
static inline void mdio(struct fs_enet_mii_bus *bus, int what)
|
||||
static inline void mdio(struct bb_info *bitbang , int what)
|
||||
{
|
||||
if (what)
|
||||
bb_set(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk);
|
||||
bb_set(bitbang->mdio_dat, bitbang->mdio_dat_msk);
|
||||
else
|
||||
bb_clr(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk);
|
||||
bb_clr(bitbang->mdio_dat, bitbang->mdio_dat_msk);
|
||||
}
|
||||
|
||||
static inline void mdc(struct fs_enet_mii_bus *bus, int what)
|
||||
static inline void mdc(struct bb_info *bitbang , int what)
|
||||
{
|
||||
if (what)
|
||||
bb_set(bus->bitbang.mdc_dat, bus->bitbang.mdc_msk);
|
||||
bb_set(bitbang->mdc_dat, bitbang->mdc_msk);
|
||||
else
|
||||
bb_clr(bus->bitbang.mdc_dat, bus->bitbang.mdc_msk);
|
||||
bb_clr(bitbang->mdc_dat, bitbang->mdc_msk);
|
||||
}
|
||||
|
||||
static inline void mii_delay(struct fs_enet_mii_bus *bus)
|
||||
static inline void mii_delay(struct bb_info *bitbang )
|
||||
{
|
||||
udelay(bus->bus_info->i.bitbang.delay);
|
||||
udelay(bitbang->delay);
|
||||
}
|
||||
|
||||
/* Utility to send the preamble, address, and register (common to read and write). */
|
||||
static void bitbang_pre(struct fs_enet_mii_bus *bus, int read, u8 addr, u8 reg)
|
||||
static void bitbang_pre(struct bb_info *bitbang , int read, u8 addr, u8 reg)
|
||||
{
|
||||
int j;
|
||||
|
||||
@@ -228,177 +125,284 @@ static void bitbang_pre(struct fs_enet_mii_bus *bus, int read, u8 addr, u8 reg)
|
||||
* but it is safer and will be much more robust.
|
||||
*/
|
||||
|
||||
mdio_active(bus);
|
||||
mdio(bus, 1);
|
||||
mdio_active(bitbang);
|
||||
mdio(bitbang, 1);
|
||||
for (j = 0; j < 32; j++) {
|
||||
mdc(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
}
|
||||
|
||||
/* send the start bit (01) and the read opcode (10) or write (10) */
|
||||
mdc(bus, 0);
|
||||
mdio(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 0);
|
||||
mdio(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 0);
|
||||
mdio(bus, read);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 0);
|
||||
mdio(bus, !read);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, read);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, !read);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
|
||||
/* send the PHY address */
|
||||
for (j = 0; j < 5; j++) {
|
||||
mdc(bus, 0);
|
||||
mdio(bus, (addr & 0x10) != 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, (addr & 0x10) != 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
addr <<= 1;
|
||||
}
|
||||
|
||||
/* send the register address */
|
||||
for (j = 0; j < 5; j++) {
|
||||
mdc(bus, 0);
|
||||
mdio(bus, (reg & 0x10) != 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, (reg & 0x10) != 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
reg <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int mii_read(struct fs_enet_mii_bus *bus, int phy_id, int location)
|
||||
static int fs_enet_mii_bb_read(struct mii_bus *bus , int phy_id, int location)
|
||||
{
|
||||
u16 rdreg;
|
||||
int ret, j;
|
||||
u8 addr = phy_id & 0xff;
|
||||
u8 reg = location & 0xff;
|
||||
struct bb_info* bitbang = bus->priv;
|
||||
|
||||
bitbang_pre(bus, 1, addr, reg);
|
||||
bitbang_pre(bitbang, 1, addr, reg);
|
||||
|
||||
/* tri-state our MDIO I/O pin so we can read */
|
||||
mdc(bus, 0);
|
||||
mdio_tristate(bus);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mdio_tristate(bitbang);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
|
||||
/* check the turnaround bit: the PHY should be driving it to zero */
|
||||
if (mdio_read(bus) != 0) {
|
||||
if (mdio_read(bitbang) != 0) {
|
||||
/* PHY didn't drive TA low */
|
||||
for (j = 0; j < 32; j++) {
|
||||
mdc(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
}
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mdc(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
|
||||
/* read 16 bits of register data, MSB first */
|
||||
rdreg = 0;
|
||||
for (j = 0; j < 16; j++) {
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
rdreg <<= 1;
|
||||
rdreg |= mdio_read(bus);
|
||||
mdc(bus, 0);
|
||||
mii_delay(bus);
|
||||
rdreg |= mdio_read(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
}
|
||||
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
|
||||
ret = rdreg;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int val)
|
||||
static int fs_enet_mii_bb_write(struct mii_bus *bus, int phy_id, int location, u16 val)
|
||||
{
|
||||
int j;
|
||||
struct bb_info* bitbang = bus->priv;
|
||||
|
||||
u8 addr = phy_id & 0xff;
|
||||
u8 reg = location & 0xff;
|
||||
u16 value = val & 0xffff;
|
||||
|
||||
bitbang_pre(bus, 0, addr, reg);
|
||||
bitbang_pre(bitbang, 0, addr, reg);
|
||||
|
||||
/* send the turnaround (10) */
|
||||
mdc(bus, 0);
|
||||
mdio(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 0);
|
||||
mdio(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
|
||||
/* write 16 bits of register data, MSB first */
|
||||
for (j = 0; j < 16; j++) {
|
||||
mdc(bus, 0);
|
||||
mdio(bus, (value & 0x8000) != 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdc(bitbang, 0);
|
||||
mdio(bitbang, (value & 0x8000) != 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
value <<= 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tri-state the MDIO line.
|
||||
*/
|
||||
mdio_tristate(bus);
|
||||
mdc(bus, 0);
|
||||
mii_delay(bus);
|
||||
mdc(bus, 1);
|
||||
mii_delay(bus);
|
||||
mdio_tristate(bitbang);
|
||||
mdc(bitbang, 0);
|
||||
mii_delay(bitbang);
|
||||
mdc(bitbang, 1);
|
||||
mii_delay(bitbang);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fs_mii_bitbang_init(struct fs_enet_mii_bus *bus)
|
||||
static int fs_enet_mii_bb_reset(struct mii_bus *bus)
|
||||
{
|
||||
/*nothing here - dunno how to reset it*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fs_mii_bitbang_init(struct bb_info *bitbang, struct fs_mii_bb_platform_info* fmpi)
|
||||
{
|
||||
const struct fs_mii_bus_info *bi = bus->bus_info;
|
||||
int r;
|
||||
|
||||
r = bitbang_prep_bit(&bus->bitbang.mdio_dir,
|
||||
&bus->bitbang.mdio_dat,
|
||||
&bus->bitbang.mdio_msk,
|
||||
bi->i.bitbang.mdio_port,
|
||||
bi->i.bitbang.mdio_bit);
|
||||
bitbang->delay = fmpi->delay;
|
||||
|
||||
r = bitbang_prep_bit(&bitbang->mdio_dir,
|
||||
&bitbang->mdio_dir_msk,
|
||||
&fmpi->mdio_dir);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
r = bitbang_prep_bit(&bus->bitbang.mdc_dir,
|
||||
&bus->bitbang.mdc_dat,
|
||||
&bus->bitbang.mdc_msk,
|
||||
bi->i.bitbang.mdc_port,
|
||||
bi->i.bitbang.mdc_bit);
|
||||
r = bitbang_prep_bit(&bitbang->mdio_dat,
|
||||
&bitbang->mdio_dat_msk,
|
||||
&fmpi->mdio_dat);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
bus->mii_read = mii_read;
|
||||
bus->mii_write = mii_write;
|
||||
r = bitbang_prep_bit(&bitbang->mdc_dat,
|
||||
&bitbang->mdc_msk,
|
||||
&fmpi->mdc_dat);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int __devinit fs_enet_mdio_probe(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct fs_mii_bb_platform_info *pdata;
|
||||
struct mii_bus *new_bus;
|
||||
struct bb_info *bitbang;
|
||||
int err = 0;
|
||||
|
||||
if (NULL == dev)
|
||||
return -EINVAL;
|
||||
|
||||
new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
|
||||
|
||||
if (NULL == new_bus)
|
||||
return -ENOMEM;
|
||||
|
||||
bitbang = kzalloc(sizeof(struct bb_info), GFP_KERNEL);
|
||||
|
||||
if (NULL == bitbang)
|
||||
return -ENOMEM;
|
||||
|
||||
new_bus->name = "BB MII Bus",
|
||||
new_bus->read = &fs_enet_mii_bb_read,
|
||||
new_bus->write = &fs_enet_mii_bb_write,
|
||||
new_bus->reset = &fs_enet_mii_bb_reset,
|
||||
new_bus->id = pdev->id;
|
||||
|
||||
new_bus->phy_mask = ~0x9;
|
||||
pdata = (struct fs_mii_bb_platform_info *)pdev->dev.platform_data;
|
||||
|
||||
if (NULL == pdata) {
|
||||
printk(KERN_ERR "gfar mdio %d: Missing platform data!\n", pdev->id);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*set up workspace*/
|
||||
fs_mii_bitbang_init(bitbang, pdata);
|
||||
|
||||
new_bus->priv = bitbang;
|
||||
|
||||
new_bus->irq = pdata->irq;
|
||||
|
||||
new_bus->dev = dev;
|
||||
dev_set_drvdata(dev, new_bus);
|
||||
|
||||
err = mdiobus_register(new_bus);
|
||||
|
||||
if (0 != err) {
|
||||
printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
|
||||
new_bus->name);
|
||||
goto bus_register_fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
bus_register_fail:
|
||||
kfree(bitbang);
|
||||
kfree(new_bus);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int fs_enet_mdio_remove(struct device *dev)
|
||||
{
|
||||
struct mii_bus *bus = dev_get_drvdata(dev);
|
||||
|
||||
mdiobus_unregister(bus);
|
||||
|
||||
dev_set_drvdata(dev, NULL);
|
||||
|
||||
iounmap((void *) (&bus->priv));
|
||||
bus->priv = NULL;
|
||||
kfree(bus);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_driver fs_enet_bb_mdio_driver = {
|
||||
.name = "fsl-bb-mdio",
|
||||
.bus = &platform_bus_type,
|
||||
.probe = fs_enet_mdio_probe,
|
||||
.remove = fs_enet_mdio_remove,
|
||||
};
|
||||
|
||||
int fs_enet_mdio_bb_init(void)
|
||||
{
|
||||
return driver_register(&fs_enet_bb_mdio_driver);
|
||||
}
|
||||
|
||||
void fs_enet_mdio_bb_exit(void)
|
||||
{
|
||||
driver_unregister(&fs_enet_bb_mdio_driver);
|
||||
}
|
||||
|
||||
|
||||
243
drivers/net/fs_enet/mii-fec.c
Normal file
243
drivers/net/fs_enet/mii-fec.c
Normal file
@@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Combined Ethernet driver for Motorola MPC8xx and MPC82xx.
|
||||
*
|
||||
* Copyright (c) 2003 Intracom S.A.
|
||||
* by Pantelis Antoniou <panto@intracom.gr>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc.
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "fs_enet.h"
|
||||
#include "fec.h"
|
||||
|
||||
/* Make MII read/write commands for the FEC.
|
||||
*/
|
||||
#define mk_mii_read(REG) (0x60020000 | ((REG & 0x1f) << 18))
|
||||
#define mk_mii_write(REG, VAL) (0x50020000 | ((REG & 0x1f) << 18) | (VAL & 0xffff))
|
||||
#define mk_mii_end 0
|
||||
|
||||
#define FEC_MII_LOOPS 10000
|
||||
|
||||
static int match_has_phy (struct device *dev, void* data)
|
||||
{
|
||||
struct platform_device* pdev = container_of(dev, struct platform_device, dev);
|
||||
struct fs_platform_info* fpi;
|
||||
if(strcmp(pdev->name, (char*)data))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
fpi = pdev->dev.platform_data;
|
||||
if((fpi)&&(fpi->has_phy))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fs_mii_fec_init(struct fec_info* fec, struct fs_mii_fec_platform_info *fmpi)
|
||||
{
|
||||
struct resource *r;
|
||||
fec_t *fecp;
|
||||
char* name = "fsl-cpm-fec";
|
||||
|
||||
/* we need fec in order to be useful */
|
||||
struct platform_device *fec_pdev =
|
||||
container_of(bus_find_device(&platform_bus_type, NULL, name, match_has_phy),
|
||||
struct platform_device, dev);
|
||||
|
||||
if(fec_pdev == NULL) {
|
||||
printk(KERN_ERR"Unable to find PHY for %s", name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
r = platform_get_resource_byname(fec_pdev, IORESOURCE_MEM, "regs");
|
||||
|
||||
fec->fecp = fecp = (fec_t*)ioremap(r->start,sizeof(fec_t));
|
||||
fec->mii_speed = fmpi->mii_speed;
|
||||
|
||||
setbits32(&fecp->fec_r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */
|
||||
setbits32(&fecp->fec_ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN);
|
||||
out_be32(&fecp->fec_ievent, FEC_ENET_MII);
|
||||
out_be32(&fecp->fec_mii_speed, fec->mii_speed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fs_enet_fec_mii_read(struct mii_bus *bus , int phy_id, int location)
|
||||
{
|
||||
struct fec_info* fec = bus->priv;
|
||||
fec_t *fecp = fec->fecp;
|
||||
int i, ret = -1;
|
||||
|
||||
if ((in_be32(&fecp->fec_r_cntrl) & FEC_RCNTRL_MII_MODE) == 0)
|
||||
BUG();
|
||||
|
||||
/* Add PHY address to register command. */
|
||||
out_be32(&fecp->fec_mii_data, (phy_id << 23) | mk_mii_read(location));
|
||||
|
||||
for (i = 0; i < FEC_MII_LOOPS; i++)
|
||||
if ((in_be32(&fecp->fec_ievent) & FEC_ENET_MII) != 0)
|
||||
break;
|
||||
|
||||
if (i < FEC_MII_LOOPS) {
|
||||
out_be32(&fecp->fec_ievent, FEC_ENET_MII);
|
||||
ret = in_be32(&fecp->fec_mii_data) & 0xffff;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static int fs_enet_fec_mii_write(struct mii_bus *bus, int phy_id, int location, u16 val)
|
||||
{
|
||||
struct fec_info* fec = bus->priv;
|
||||
fec_t *fecp = fec->fecp;
|
||||
int i;
|
||||
|
||||
/* this must never happen */
|
||||
if ((in_be32(&fecp->fec_r_cntrl) & FEC_RCNTRL_MII_MODE) == 0)
|
||||
BUG();
|
||||
|
||||
/* Add PHY address to register command. */
|
||||
out_be32(&fecp->fec_mii_data, (phy_id << 23) | mk_mii_write(location, val));
|
||||
|
||||
for (i = 0; i < FEC_MII_LOOPS; i++)
|
||||
if ((in_be32(&fecp->fec_ievent) & FEC_ENET_MII) != 0)
|
||||
break;
|
||||
|
||||
if (i < FEC_MII_LOOPS)
|
||||
out_be32(&fecp->fec_ievent, FEC_ENET_MII);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int fs_enet_fec_mii_reset(struct mii_bus *bus)
|
||||
{
|
||||
/* nothing here - for now */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit fs_enet_fec_mdio_probe(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct fs_mii_fec_platform_info *pdata;
|
||||
struct mii_bus *new_bus;
|
||||
struct fec_info *fec;
|
||||
int err = 0;
|
||||
if (NULL == dev)
|
||||
return -EINVAL;
|
||||
new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
|
||||
|
||||
if (NULL == new_bus)
|
||||
return -ENOMEM;
|
||||
|
||||
fec = kzalloc(sizeof(struct fec_info), GFP_KERNEL);
|
||||
|
||||
if (NULL == fec)
|
||||
return -ENOMEM;
|
||||
|
||||
new_bus->name = "FEC MII Bus",
|
||||
new_bus->read = &fs_enet_fec_mii_read,
|
||||
new_bus->write = &fs_enet_fec_mii_write,
|
||||
new_bus->reset = &fs_enet_fec_mii_reset,
|
||||
new_bus->id = pdev->id;
|
||||
|
||||
pdata = (struct fs_mii_fec_platform_info *)pdev->dev.platform_data;
|
||||
|
||||
if (NULL == pdata) {
|
||||
printk(KERN_ERR "fs_enet FEC mdio %d: Missing platform data!\n", pdev->id);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*set up workspace*/
|
||||
|
||||
fs_mii_fec_init(fec, pdata);
|
||||
new_bus->priv = fec;
|
||||
|
||||
new_bus->irq = pdata->irq;
|
||||
|
||||
new_bus->dev = dev;
|
||||
dev_set_drvdata(dev, new_bus);
|
||||
|
||||
err = mdiobus_register(new_bus);
|
||||
|
||||
if (0 != err) {
|
||||
printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
|
||||
new_bus->name);
|
||||
goto bus_register_fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
bus_register_fail:
|
||||
kfree(new_bus);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int fs_enet_fec_mdio_remove(struct device *dev)
|
||||
{
|
||||
struct mii_bus *bus = dev_get_drvdata(dev);
|
||||
|
||||
mdiobus_unregister(bus);
|
||||
|
||||
dev_set_drvdata(dev, NULL);
|
||||
kfree(bus->priv);
|
||||
|
||||
bus->priv = NULL;
|
||||
kfree(bus);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_driver fs_enet_fec_mdio_driver = {
|
||||
.name = "fsl-cpm-fec-mdio",
|
||||
.bus = &platform_bus_type,
|
||||
.probe = fs_enet_fec_mdio_probe,
|
||||
.remove = fs_enet_fec_mdio_remove,
|
||||
};
|
||||
|
||||
int fs_enet_mdio_fec_init(void)
|
||||
{
|
||||
return driver_register(&fs_enet_fec_mdio_driver);
|
||||
}
|
||||
|
||||
void fs_enet_mdio_fec_exit(void)
|
||||
{
|
||||
driver_unregister(&fs_enet_fec_mdio_driver);
|
||||
}
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
* Combined Ethernet driver for Motorola MPC8xx and MPC82xx.
|
||||
*
|
||||
* Copyright (c) 2003 Intracom S.A.
|
||||
* by Pantelis Antoniou <panto@intracom.gr>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc.
|
||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "fs_enet.h"
|
||||
|
||||
static const u16 mii_regs[7] = {
|
||||
0x3100,
|
||||
0x786d,
|
||||
0x0fff,
|
||||
0x0fff,
|
||||
0x01e1,
|
||||
0x45e1,
|
||||
0x0003,
|
||||
};
|
||||
|
||||
static int mii_read(struct fs_enet_mii_bus *bus, int phy_id, int location)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if ((unsigned int)location >= ARRAY_SIZE(mii_regs))
|
||||
return -1;
|
||||
|
||||
if (location != 5)
|
||||
ret = mii_regs[location];
|
||||
else
|
||||
ret = bus->fixed.lpa;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int val)
|
||||
{
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
int fs_mii_fixed_init(struct fs_enet_mii_bus *bus)
|
||||
{
|
||||
const struct fs_mii_bus_info *bi = bus->bus_info;
|
||||
|
||||
bus->fixed.lpa = 0x45e1; /* default 100Mb, full duplex */
|
||||
|
||||
/* if speed is fixed at 10Mb, remove 100Mb modes */
|
||||
if (bi->i.fixed.speed == 10)
|
||||
bus->fixed.lpa &= ~LPA_100;
|
||||
|
||||
/* if duplex is half, remove full duplex modes */
|
||||
if (bi->i.fixed.duplex == 0)
|
||||
bus->fixed.lpa &= ~LPA_DUPLEX;
|
||||
|
||||
bus->mii_read = mii_read;
|
||||
bus->mii_write = mii_write;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -326,7 +326,7 @@ MODULE_PARM_DESC(dma, "LANCE/PCnet ISA DMA channel (ignored for some devices)");
|
||||
MODULE_PARM_DESC(irq, "LANCE/PCnet IRQ number (ignored for some devices)");
|
||||
MODULE_PARM_DESC(lance_debug, "LANCE/PCnet debug level (0-7)");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int this_dev, found = 0;
|
||||
|
||||
@@ -406,7 +406,7 @@ MODULE_PARM_DESC(mem, "memory base address(es)");
|
||||
MODULE_DESCRIPTION("Mylex LNE390A/B EISA Ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int this_dev, found = 0;
|
||||
|
||||
@@ -2425,7 +2425,7 @@ static int myri10ge_resume(struct pci_dev *pdev)
|
||||
}
|
||||
|
||||
myri10ge_reset(mgp);
|
||||
myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096);
|
||||
myri10ge_dummy_rdma(mgp, 1);
|
||||
|
||||
/* Save configuration space to be restored if the
|
||||
* nic resets due to a parity error */
|
||||
|
||||
@@ -1323,7 +1323,7 @@ MODULE_PARM_DESC(irq, "NI5210 IRQ number,required");
|
||||
MODULE_PARM_DESC(memstart, "NI5210 memory base address,required");
|
||||
MODULE_PARM_DESC(memend, "NI5210 memory end address,required");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
if(io <= 0x0 || !memend || !memstart || irq < 2) {
|
||||
printk("ni52: Autoprobing not allowed for modules.\nni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n");
|
||||
|
||||
@@ -1253,7 +1253,7 @@ MODULE_PARM_DESC(irq, "ni6510 IRQ number (ignored for some cards)");
|
||||
MODULE_PARM_DESC(io, "ni6510 I/O base address");
|
||||
MODULE_PARM_DESC(dma, "ni6510 ISA DMA channel (ignored for some cards)");
|
||||
|
||||
int init_module(void)
|
||||
int __init init_module(void)
|
||||
{
|
||||
dev_ni65 = ni65_probe(-1);
|
||||
return IS_ERR(dev_ni65) ? PTR_ERR(dev_ni65) : 0;
|
||||
|
||||
@@ -345,6 +345,7 @@ typedef struct local_info_t {
|
||||
void __iomem *dingo_ccr; /* only used for CEM56 cards */
|
||||
unsigned last_ptr_value; /* last packets transmitted value */
|
||||
const char *manf_str;
|
||||
struct work_struct tx_timeout_task;
|
||||
} local_info_t;
|
||||
|
||||
/****************
|
||||
@@ -352,6 +353,7 @@ typedef struct local_info_t {
|
||||
*/
|
||||
static int do_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
static void do_tx_timeout(struct net_device *dev);
|
||||
static void xirc2ps_tx_timeout_task(void *data);
|
||||
static struct net_device_stats *do_get_stats(struct net_device *dev);
|
||||
static void set_addresses(struct net_device *dev);
|
||||
static void set_multicast_list(struct net_device *dev);
|
||||
@@ -589,6 +591,7 @@ xirc2ps_probe(struct pcmcia_device *link)
|
||||
#ifdef HAVE_TX_TIMEOUT
|
||||
dev->tx_timeout = do_tx_timeout;
|
||||
dev->watchdog_timeo = TX_TIMEOUT;
|
||||
INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task, dev);
|
||||
#endif
|
||||
|
||||
return xirc2ps_config(link);
|
||||
@@ -1341,17 +1344,24 @@ xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
/*====================================================================*/
|
||||
|
||||
static void
|
||||
do_tx_timeout(struct net_device *dev)
|
||||
xirc2ps_tx_timeout_task(void *data)
|
||||
{
|
||||
local_info_t *lp = netdev_priv(dev);
|
||||
printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
|
||||
lp->stats.tx_errors++;
|
||||
struct net_device *dev = data;
|
||||
/* reset the card */
|
||||
do_reset(dev,1);
|
||||
dev->trans_start = jiffies;
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
static void
|
||||
do_tx_timeout(struct net_device *dev)
|
||||
{
|
||||
local_info_t *lp = netdev_priv(dev);
|
||||
lp->stats.tx_errors++;
|
||||
printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
|
||||
schedule_work(&lp->tx_timeout_task);
|
||||
}
|
||||
|
||||
static int
|
||||
do_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user