#include #include "notifier-error-inject.h" static int debugfs_errno_set(void *data, u64 val) { *(int *)data = clamp_t(int, val, -MAX_ERRNO, 0); return 0; } static int debugfs_errno_get(void *data, u64 *val) { *val = *(int *)data; return 0; } DEFINE_SIMPLE_ATTRIBUTE(fops_errno, debugfs_errno_get, debugfs_errno_set, "%lld\n"); static struct dentry *debugfs_create_errno(const char *name, umode_t mode, struct dentry *parent, int *value) { return debugfs_create_file(name, mode, parent, value, &fops_errno); } static int notifier_err_inject_callback(struct notifier_block *nb, unsigned long val, void *p) { int err = 0; struct notifier_err_inject *err_inject = container_of(nb, struct notifier_err_inject, nb); struct notifier_err_inject_action *action; for (action = err_inject->actions; action->name; action++) { if (action->val == val) { err = action->error; break; } } if (err) pr_info("Injecting error (%d) to %s\n", err, action->name); return notifier_from_errno(err); } struct dentry *notifier_err_inject_dir; EXPORT_SYMBOL_GPL(notifier_err_inject_dir); struct dentry *notifier_err_inject_init(const char *name, struct dentry *parent, struct notifier_err_inject *err_inject, int priority) { struct notifier_err_inject_action *action; umode_t mode = S_IFREG | S_IRUSR | S_IWUSR; struct dentry *dir; struct dentry *actions_dir; err_inject->nb.notifier_call = notifier_err_inject_callback; err_inject->nb.priority = priority; dir = debugfs_create_dir(name, parent); if (!dir) return ERR_PTR(-ENOMEM); actions_dir = debugfs_create_dir("actions", dir); if (!actions_dir) goto fail; for (action = err_inject->actions; action->name; action++) { struct dentry *action_dir; action_dir = debugfs_create_dir(action->name, actions_dir); if (!action_dir) goto fail; /* * Create debugfs r/w file containing action->error. If * notifier call chain is called with action->val, it will * fail with the error code */ if (!debugfs_create_errno("error", mode, action_dir, &action->error)) goto fail; } return dir; fail: debugfs_remove_recursive(dir); return ERR_PTR(-ENOMEM); } EXPORT_SYMBOL_GPL(notifier_err_inject_init); static int __init err_inject_init(void) { notifier_err_inject_dir = debugfs_create_dir("notifier-error-inject", NULL); if (!notifier_err_inject_dir) return -ENOMEM; return 0; } static void __exit err_inject_exit(void) { debugfs_remove_recursive(notifier_err_inject_dir); } module_init(err_inject_init); module_exit(err_inject_exit); MODULE_DESCRIPTION("Notifier error injection module"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Akinobu Mita "); ext.git/commit/drivers?id=891daf49b0f6e900af6bde51e2dc2cbc72b83f4e'>drivers
diff options
context:
space:
mode:
authorRomain Perier <romain.perier@free-electrons.com>2017-01-30 20:29:33 +0100
committerDavid S. Miller <davem@davemloft.net>2017-01-30 16:50:56 -0500
commit891daf49b0f6e900af6bde51e2dc2cbc72b83f4e (patch)
treec3ece580aad9d789166579fe7cafacc9f4199d4f /drivers
parentcdaf25dfc058ee6f7a7b2e2353de00fa288c0cd4 (diff)
net: dsa: mv88e6xxx: Don't forbid MDIO I/Os for PHY addr >= num_of_ports
Some Marvell ethernet switches have internal ethernet transceivers with hardcoded phy addresses. These addresses can be greater than the number of ports or its value might be different than the associated port number. This is for example the case for MV88E6341 that has 6 ports and internal Port 1 to Port4 PHYs mapped at SMI addresses from 0x11 to 0x14. This commits fixes the issue by removing the condition in MDIO callbacks. Signed-off-by: Romain Perier <romain.perier@free-electrons.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.c6
1 files changed, 0 insertions, 6 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c