|
@@ -32,6 +32,7 @@
|
|
|
#include <linux/aer.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/firmware.h>
|
|
|
+#include <linux/miscdevice.h>
|
|
|
|
|
|
#include <scsi/scsi.h>
|
|
|
#include <scsi/scsi_device.h>
|
|
@@ -10012,6 +10013,36 @@ lpfc_io_resume(struct pci_dev *pdev)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * lpfc_mgmt_open - method called when 'lpfcmgmt' is opened from userspace
|
|
|
+ * @inode: pointer to the inode representing the lpfcmgmt device
|
|
|
+ * @filep: pointer to the file representing the open lpfcmgmt device
|
|
|
+ *
|
|
|
+ * This routine puts a reference count on the lpfc module whenever the
|
|
|
+ * character device is opened
|
|
|
+ **/
|
|
|
+static int
|
|
|
+lpfc_mgmt_open(struct inode *inode, struct file *filep)
|
|
|
+{
|
|
|
+ try_module_get(THIS_MODULE);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * lpfc_mgmt_release - method called when 'lpfcmgmt' is closed in userspace
|
|
|
+ * @inode: pointer to the inode representing the lpfcmgmt device
|
|
|
+ * @filep: pointer to the file representing the open lpfcmgmt device
|
|
|
+ *
|
|
|
+ * This routine removes a reference count from the lpfc module when the
|
|
|
+ * character device is closed
|
|
|
+ **/
|
|
|
+static int
|
|
|
+lpfc_mgmt_release(struct inode *inode, struct file *filep)
|
|
|
+{
|
|
|
+ module_put(THIS_MODULE);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static struct pci_device_id lpfc_id_table[] = {
|
|
|
{PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER,
|
|
|
PCI_ANY_ID, PCI_ANY_ID, },
|
|
@@ -10124,6 +10155,17 @@ static struct pci_driver lpfc_driver = {
|
|
|
.err_handler = &lpfc_err_handler,
|
|
|
};
|
|
|
|
|
|
+static const struct file_operations lpfc_mgmt_fop = {
|
|
|
+ .open = lpfc_mgmt_open,
|
|
|
+ .release = lpfc_mgmt_release,
|
|
|
+};
|
|
|
+
|
|
|
+static struct miscdevice lpfc_mgmt_dev = {
|
|
|
+ .minor = MISC_DYNAMIC_MINOR,
|
|
|
+ .name = "lpfcmgmt",
|
|
|
+ .fops = &lpfc_mgmt_fop,
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* lpfc_init - lpfc module initialization routine
|
|
|
*
|
|
@@ -10144,6 +10186,11 @@ lpfc_init(void)
|
|
|
printk(LPFC_MODULE_DESC "\n");
|
|
|
printk(LPFC_COPYRIGHT "\n");
|
|
|
|
|
|
+ error = misc_register(&lpfc_mgmt_dev);
|
|
|
+ if (error)
|
|
|
+ printk(KERN_ERR "Could not register lpfcmgmt device, "
|
|
|
+ "misc_register returned with status %d", error);
|
|
|
+
|
|
|
if (lpfc_enable_npiv) {
|
|
|
lpfc_transport_functions.vport_create = lpfc_vport_create;
|
|
|
lpfc_transport_functions.vport_delete = lpfc_vport_delete;
|
|
@@ -10180,6 +10227,7 @@ lpfc_init(void)
|
|
|
static void __exit
|
|
|
lpfc_exit(void)
|
|
|
{
|
|
|
+ misc_deregister(&lpfc_mgmt_dev);
|
|
|
pci_unregister_driver(&lpfc_driver);
|
|
|
fc_release_transport(lpfc_transport_template);
|
|
|
if (lpfc_enable_npiv)
|