Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The netfilter conflicts were rather simple overlapping changes. However, the cls_tcindex.c stuff was a bit more complex. On the 'net' side, Cong is fixing several races and memory leaks. Whilst on the 'net-next' side we have Vlad adding the rtnl-ness support. What I've decided to do, in order to resolve this, is revert the conversion over to using a workqueue that Cong did, bringing us back to pure RCU. I did it this way because I believe that either Cong's races don't apply with have Vlad did things, or Cong will have to implement the race fix slightly differently. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -185,6 +185,7 @@ struct sfp {
|
||||
|
||||
struct gpio_desc *gpio[GPIO_MAX];
|
||||
|
||||
bool attached;
|
||||
unsigned int state;
|
||||
struct delayed_work poll;
|
||||
struct delayed_work timeout;
|
||||
@@ -1476,7 +1477,7 @@ static void sfp_sm_event(struct sfp *sfp, unsigned int event)
|
||||
*/
|
||||
switch (sfp->sm_mod_state) {
|
||||
default:
|
||||
if (event == SFP_E_INSERT) {
|
||||
if (event == SFP_E_INSERT && sfp->attached) {
|
||||
sfp_module_tx_disable(sfp);
|
||||
sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT);
|
||||
}
|
||||
@@ -1608,6 +1609,19 @@ static void sfp_sm_event(struct sfp *sfp, unsigned int event)
|
||||
mutex_unlock(&sfp->sm_mutex);
|
||||
}
|
||||
|
||||
static void sfp_attach(struct sfp *sfp)
|
||||
{
|
||||
sfp->attached = true;
|
||||
if (sfp->state & SFP_F_PRESENT)
|
||||
sfp_sm_event(sfp, SFP_E_INSERT);
|
||||
}
|
||||
|
||||
static void sfp_detach(struct sfp *sfp)
|
||||
{
|
||||
sfp->attached = false;
|
||||
sfp_sm_event(sfp, SFP_E_REMOVE);
|
||||
}
|
||||
|
||||
static void sfp_start(struct sfp *sfp)
|
||||
{
|
||||
sfp_sm_event(sfp, SFP_E_DEV_UP);
|
||||
@@ -1668,6 +1682,8 @@ static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee,
|
||||
}
|
||||
|
||||
static const struct sfp_socket_ops sfp_module_ops = {
|
||||
.attach = sfp_attach,
|
||||
.detach = sfp_detach,
|
||||
.start = sfp_start,
|
||||
.stop = sfp_stop,
|
||||
.module_info = sfp_module_info,
|
||||
@@ -1835,10 +1851,6 @@ static int sfp_probe(struct platform_device *pdev)
|
||||
dev_info(sfp->dev, "Host maximum power %u.%uW\n",
|
||||
sfp->max_power_mW / 1000, (sfp->max_power_mW / 100) % 10);
|
||||
|
||||
sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops);
|
||||
if (!sfp->sfp_bus)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Get the initial state, and always signal TX disable,
|
||||
* since the network interface will not be up.
|
||||
*/
|
||||
@@ -1849,10 +1861,6 @@ static int sfp_probe(struct platform_device *pdev)
|
||||
sfp->state |= SFP_F_RATE_SELECT;
|
||||
sfp_set_state(sfp, sfp->state);
|
||||
sfp_module_tx_disable(sfp);
|
||||
rtnl_lock();
|
||||
if (sfp->state & SFP_F_PRESENT)
|
||||
sfp_sm_event(sfp, SFP_E_INSERT);
|
||||
rtnl_unlock();
|
||||
|
||||
for (i = 0; i < GPIO_MAX; i++) {
|
||||
if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i])
|
||||
@@ -1885,6 +1893,10 @@ static int sfp_probe(struct platform_device *pdev)
|
||||
dev_warn(sfp->dev,
|
||||
"No tx_disable pin: SFP modules will always be emitting.\n");
|
||||
|
||||
sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops);
|
||||
if (!sfp->sfp_bus)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user