Messages in this thread |  | | Date | Tue, 17 Dec 2019 16:56:23 +0800 | From | cang@codeauro ... | Subject | Re: [PATCH v2 2/3] scsi: ufs: Modulize ufs-bsg |
| |
On 2019-12-17 01:22, Bart Van Assche wrote: > On 12/15/19 8:36 PM, cang@codeaurora.org wrote: >> On 2019-12-16 05:49, Bart Van Assche wrote: >>> On 2019-12-11 22:37, Bjorn Andersson wrote: >>>> It's the asymmetry that I don't like. >>>> >>>> Perhaps if you instead make ufshcd platform_device_register_data() >>>> the >>>> bsg device you would solve the probe ordering, the remove will be >>>> symmetric and module autoloading will work as well (although then >>>> you >>>> need a MODULE_ALIAS of platform:device-name). >>> >>> Hi Bjorn, >>> >>> From Documentation/driver-api/driver-model/platform.rst: >>> "Platform devices are devices that typically appear as autonomous >>> entities in the system. This includes legacy port-based devices and >>> host bridges to peripheral buses, and most controllers integrated >>> into system-on-chip platforms. What they usually have in common >>> is direct addressing from a CPU bus. Rarely, a platform_device will >>> be connected through a segment of some other kind of bus; but its >>> registers will still be directly addressable." >>> >>> Do you agree that the above description is not a good match for the >>> ufs-bsg kernel module? >> >> I missed this one. >> How about making it a plain device and add it from ufs driver? > > Hi Can, > > Since the ufs_bsg kernel module already creates one device node under > /dev/bsg for each UFS host I don't think that we need to create any > additional device nodes for ufs-bsg devices. My proposal is to modify > the original patch 2/3 from this series as follows: > * Use module_init() instead of late_initcall_sync(). > * Remove the ufshcd_get_hba_list_lock() and > ufshcd_put_hba_list_unlock() functions. > * Implement a notification mechanism in the UFS core that invokes a > callback function after an UFS host has been created and also after > an > UFS host has been removed. > * Register for these notifications from inside the ufs-bsg driver. > * During registration for notifications, invoke the UFS host creation > callback function for all known UFS hosts. > * If the UFS core is unloaded, invoke the UFS host removal callback > function for all known UFS hosts. > > I think there are several examples of similar notification mechanisms > in the Linux kernel, e.g. the probe and remove callback functions in > struct pci_driver. > > Bart.
Hi Bart,
Even in the current ufs_bsg.c, it creates two devices, one is ufs-bsg, one is the char dev node under /dev/bsg. Why this becomes a problem after make it a module?
I took a look into the pci_driver, it is no different than making ufs-bsg a plain device. The only special place about pci_driver is that it has its own probe() and remove(), and the probe() in its bus_type calls the probe() in pci_driver. Meaning the bus->probe() is an intermediate call used to pass whatever needed by pci_driver->probe().
Of course we can also do this, but isn't it too much for ufs-bsg? For our case, calling set_dev_drvdata(bsg_dev, hba) to pass hba to ufs_bsg.c would be enough.
If you take a look at the V3 patch, the change makes the ufs_bsg.c much conciser. platform_device_register_data() does everything for us, initialize the device, set device name, provide the match func, bus type and release func.
Since ufs-bsg is somewhat not a platform device, we can still add it as a plain device, just need a few more lines to get it initialized. This allows us leverage kernel's device driver model. Just like Greg commented, we don't need to re-implement the mechanism again.
Thanks, Can Guo.
|  |