On Fri, Feb 04, 2005 at 07:21:15PM -0800, Andrew Morton wrote:
> [EMAIL PROTECTED] (Adam Belay) wrote:
> >
> >  It looks ok.  My only concern is what would happen if the isa probe 
> > succeded
> >  but the pnp_register_driver failed?  "pnp_register_driver" return -ENODEV 
> > if
> >  "CONFIG_PNP" isn't enabled.  Do you think this would conflict with legacy
> >  probing?
> 
> Fair enough.  How about this?

The code no longer is leaking devices.  I may be overlooking something, but I
think it still doesn't retain legacy probed devices when PnP isn't available.

If "pnp_register_driver" fails then "ns588_unregister_ports" will unregister
the correctly detected ISA ports.  "pnp_register_driver" will always fail if
pnp support isn't compiled into the kernel.  We need a way of not 
unregistering "ns558_pnp_driver" in "ns558_exit" but retaining the ports
detected by the legacy probe.  In a way, this is sort of a driver model
problem.

As a more general solution for all drivers, I've been thinking about doing
something like this in the long term.

int ret;
if (!(ret = register_driver(&ns558_driver)))
        return ret;
add_driver_protocol(&ns558_driver, &ns558_pnp);
add_driver_protocol(&ns558_driver, &ns558_isa);

and then on exit:

unregister_driver(&ns558_driver); /* this tears down any successfully
                                     registered bus protocol automatically */


For now a less invasive solution might be better.

Comments?

Thanks,
Adam


> 
> static void ns588_unregister_ports(void)
> {
>       struct ns558 *port;
> 
>       list_for_each_entry(port, &ns558_list, node) {
>               gameport_unregister_port(&port->gameport);
>               switch (port->type) {
> 
> #ifdef CONFIG_PNP
>                       case NS558_PNP:
>                               /* fall through */
> #endif
>                       case NS558_ISA:
>                               release_region(port->gameport.io &
>                                       ~(port->size - 1), port->size);
>                               kfree(port);
>                               break;
> 
>                       default:
>                               break;
>               }
>       }
> }
> 
> static int __init ns558_init(void)
> {
>       int i = 0;
>       int ret;
> 
> /*
>  * Probe for ISA ports.
>  */
> 
>       while (ns558_isa_portlist[i])
>               ns558_isa_probe(ns558_isa_portlist[i++]);
> 
>       ret = pnp_register_driver(&ns558_pnp_driver);
>       if (ret < 0) {
>               ns588_unregister_ports();
>               return ret;
>       }
>       return 0;
> }
> 
> static void __exit ns558_exit(void)
> {
>       ns588_unregister_ports();
>       pnp_unregister_driver(&ns558_pnp_driver);
> }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to