Date: Thu, 27 Apr 2006 14:48:28 -0700 (PDT) From: Doug Ambrisko <ambrisko@ambrisko.com> To: freebsd-emulation@FreeBSD.ORG Subject: Linux emulation enhancement to emulate device nodes and some SCSI stuff Message-ID: <200604272148.k3RLmSOm041069@ambrisko.com>
index | next in thread | raw e-mail
To get the LSI RAID SAS to work under Linux emulation we need to emulate more of Linux type stuff. I've put patches up at: http://www.ambrisko.com/doug/linux.patches I've added back the proc/devices to the emulator although really emulated since with devfs are majors are not as Linux app's expect. So I've used a "linux_ioctl_handle" type paradigm to add a new "linux_device_handle" thing. Each entry is of type: struct linux_device_handler { char *bsd_driver_name; char *linux_driver_name; char *bsd_device_name; char *linux_device_name; int linux_major; int linux_minor; int linux_char_device; }; An example of usage is: static struct linux_device_handler mfi_device_handler = { "mfi", "megaraid_sas", "mfi0", "megaraid_sas_ioctl_node", -1, 0, 1}; SYSINIT (mfi_register2, SI_SUB_KLD, SI_ORDER_MIDDLE, linux_device_register_handler, &mfi_device_handler); SYSUNINIT(mfi_unregister2, SI_SUB_KLD, SI_ORDER_MIDDLE, linux_device_unregister_handler, &mfi_device_handler); The -1 major means allocate dynamically. This then shows up in proc/devices as: Character devices: 1 null 200 megaraid_sas_ioctl_node Block devices: I needed a entry to /dev/null so I created a static entry for that. In the new proc/sys there is a class & devices tree. The devices tree runs the PCI space sort-of like Linux and builds a tree. The class/scsi_host links into that tree. It only fills in things for PCI storage classes and fills in the "proc_name" for the driver if known like: %cat class/scsi_host/host0/proc_name megaraid_sas %ls -l class/scsi_host/host0 total 0 lr--r--r-- 1 root wheel 0 Apr 27 15:07 device -> ../../../devices/pci0000:03/0001:00.0/0002:0e.0/host0 -r--r--r-- 1 root wheel 0 Apr 27 15:07 proc_name %ls -l devices/pci0000:03/0001:00.0/0002:0e.0 total 0 dr-xr-xr-x 1 root wheel 0 Apr 27 15:07 host0 % I had to add code to linux_stat stuff to intercept and return the expected major/minor number if a device_handler was defined. With this and some changes to mfi(4) driver I can run the Linux MegaCli binary from LSI on FreeBSD. Please let me know how this patch looks. Note this is following the Linux 2.6 style. Doug A.home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604272148.k3RLmSOm041069>
