Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98dcd59d authored by Camuso, Tony's avatar Camuso, Tony Committed by Greg Kroah-Hartman
Browse files

misc: hpilo: increase number of max supported channels



Increase number of supported channels from 8 to 24.
Make the number of channels configurable via module parameter max_ccb.

Signed-off-by: default avatarMark Rusk <mark.rusk@hp.com>
Signed-off-by: default avatarTony Camuso <tony.camuso@hp.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f6a4e494
Loading
Loading
Loading
Loading
+21 −12
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@


static struct class *ilo_class;
static struct class *ilo_class;
static unsigned int ilo_major;
static unsigned int ilo_major;
static unsigned int max_ccb = MIN_CCB;
static char ilo_hwdev[MAX_ILO_DEV];
static char ilo_hwdev[MAX_ILO_DEV];


static inline int get_entry_id(int entry)
static inline int get_entry_id(int entry)
@@ -424,7 +425,7 @@ static void ilo_set_reset(struct ilo_hwinfo *hw)
	 * Mapped memory is zeroed on ilo reset, so set a per ccb flag
	 * Mapped memory is zeroed on ilo reset, so set a per ccb flag
	 * to indicate that this ccb needs to be closed and reopened.
	 * to indicate that this ccb needs to be closed and reopened.
	 */
	 */
	for (slot = 0; slot < MAX_CCB; slot++) {
	for (slot = 0; slot < max_ccb; slot++) {
		if (!hw->ccb_alloc[slot])
		if (!hw->ccb_alloc[slot])
			continue;
			continue;
		set_channel_reset(&hw->ccb_alloc[slot]->driver_ccb);
		set_channel_reset(&hw->ccb_alloc[slot]->driver_ccb);
@@ -535,7 +536,7 @@ static int ilo_close(struct inode *ip, struct file *fp)
	struct ilo_hwinfo *hw;
	struct ilo_hwinfo *hw;
	unsigned long flags;
	unsigned long flags;


	slot = iminor(ip) % MAX_CCB;
	slot = iminor(ip) % max_ccb;
	hw = container_of(ip->i_cdev, struct ilo_hwinfo, cdev);
	hw = container_of(ip->i_cdev, struct ilo_hwinfo, cdev);


	spin_lock(&hw->open_lock);
	spin_lock(&hw->open_lock);
@@ -566,7 +567,7 @@ static int ilo_open(struct inode *ip, struct file *fp)
	struct ilo_hwinfo *hw;
	struct ilo_hwinfo *hw;
	unsigned long flags;
	unsigned long flags;


	slot = iminor(ip) % MAX_CCB;
	slot = iminor(ip) % max_ccb;
	hw = container_of(ip->i_cdev, struct ilo_hwinfo, cdev);
	hw = container_of(ip->i_cdev, struct ilo_hwinfo, cdev);


	/* new ccb allocation */
	/* new ccb allocation */
@@ -663,7 +664,7 @@ static irqreturn_t ilo_isr(int irq, void *data)
		ilo_set_reset(hw);
		ilo_set_reset(hw);
	}
	}


	for (i = 0; i < MAX_CCB; i++) {
	for (i = 0; i < max_ccb; i++) {
		if (!hw->ccb_alloc[i])
		if (!hw->ccb_alloc[i])
			continue;
			continue;
		if (pending & (1 << i))
		if (pending & (1 << i))
@@ -697,14 +698,14 @@ static int __devinit ilo_map_device(struct pci_dev *pdev, struct ilo_hwinfo *hw)
	}
	}


	/* map the adapter shared memory region */
	/* map the adapter shared memory region */
	hw->ram_vaddr = pci_iomap(pdev, 2, MAX_CCB * ILOHW_CCB_SZ);
	hw->ram_vaddr = pci_iomap(pdev, 2, max_ccb * ILOHW_CCB_SZ);
	if (hw->ram_vaddr == NULL) {
	if (hw->ram_vaddr == NULL) {
		dev_err(&pdev->dev, "Error mapping shared mem\n");
		dev_err(&pdev->dev, "Error mapping shared mem\n");
		goto mmio_free;
		goto mmio_free;
	}
	}


	/* map the doorbell aperture */
	/* map the doorbell aperture */
	hw->db_vaddr = pci_iomap(pdev, 3, MAX_CCB * ONE_DB_SIZE);
	hw->db_vaddr = pci_iomap(pdev, 3, max_ccb * ONE_DB_SIZE);
	if (hw->db_vaddr == NULL) {
	if (hw->db_vaddr == NULL) {
		dev_err(&pdev->dev, "Error mapping doorbell\n");
		dev_err(&pdev->dev, "Error mapping doorbell\n");
		goto ram_free;
		goto ram_free;
@@ -727,7 +728,7 @@ static void ilo_remove(struct pci_dev *pdev)
	clear_device(ilo_hw);
	clear_device(ilo_hw);


	minor = MINOR(ilo_hw->cdev.dev);
	minor = MINOR(ilo_hw->cdev.dev);
	for (i = minor; i < minor + MAX_CCB; i++)
	for (i = minor; i < minor + max_ccb; i++)
		device_destroy(ilo_class, MKDEV(ilo_major, i));
		device_destroy(ilo_class, MKDEV(ilo_major, i));


	cdev_del(&ilo_hw->cdev);
	cdev_del(&ilo_hw->cdev);
@@ -737,7 +738,7 @@ static void ilo_remove(struct pci_dev *pdev)
	pci_release_regions(pdev);
	pci_release_regions(pdev);
	pci_disable_device(pdev);
	pci_disable_device(pdev);
	kfree(ilo_hw);
	kfree(ilo_hw);
	ilo_hwdev[(minor / MAX_CCB)] = 0;
	ilo_hwdev[(minor / max_ccb)] = 0;
}
}


static int __devinit ilo_probe(struct pci_dev *pdev,
static int __devinit ilo_probe(struct pci_dev *pdev,
@@ -746,6 +747,11 @@ static int __devinit ilo_probe(struct pci_dev *pdev,
	int devnum, minor, start, error;
	int devnum, minor, start, error;
	struct ilo_hwinfo *ilo_hw;
	struct ilo_hwinfo *ilo_hw;


	if (max_ccb > MAX_CCB)
		max_ccb = MAX_CCB;
	else if (max_ccb < MIN_CCB)
		max_ccb = MIN_CCB;

	/* find a free range for device files */
	/* find a free range for device files */
	for (devnum = 0; devnum < MAX_ILO_DEV; devnum++) {
	for (devnum = 0; devnum < MAX_ILO_DEV; devnum++) {
		if (ilo_hwdev[devnum] == 0) {
		if (ilo_hwdev[devnum] == 0) {
@@ -795,14 +801,14 @@ static int __devinit ilo_probe(struct pci_dev *pdev,


	cdev_init(&ilo_hw->cdev, &ilo_fops);
	cdev_init(&ilo_hw->cdev, &ilo_fops);
	ilo_hw->cdev.owner = THIS_MODULE;
	ilo_hw->cdev.owner = THIS_MODULE;
	start = devnum * MAX_CCB;
	start = devnum * max_ccb;
	error = cdev_add(&ilo_hw->cdev, MKDEV(ilo_major, start), MAX_CCB);
	error = cdev_add(&ilo_hw->cdev, MKDEV(ilo_major, start), max_ccb);
	if (error) {
	if (error) {
		dev_err(&pdev->dev, "Could not add cdev\n");
		dev_err(&pdev->dev, "Could not add cdev\n");
		goto remove_isr;
		goto remove_isr;
	}
	}


	for (minor = 0 ; minor < MAX_CCB; minor++) {
	for (minor = 0 ; minor < max_ccb; minor++) {
		struct device *dev;
		struct device *dev;
		dev = device_create(ilo_class, &pdev->dev,
		dev = device_create(ilo_class, &pdev->dev,
				    MKDEV(ilo_major, minor), NULL,
				    MKDEV(ilo_major, minor), NULL,
@@ -879,11 +885,14 @@ static void __exit ilo_exit(void)
	class_destroy(ilo_class);
	class_destroy(ilo_class);
}
}


MODULE_VERSION("1.2");
MODULE_VERSION("1.3");
MODULE_ALIAS(ILO_NAME);
MODULE_ALIAS(ILO_NAME);
MODULE_DESCRIPTION(ILO_NAME);
MODULE_DESCRIPTION(ILO_NAME);
MODULE_AUTHOR("David Altobelli <david.altobelli@hp.com>");
MODULE_AUTHOR("David Altobelli <david.altobelli@hp.com>");
MODULE_LICENSE("GPL v2");
MODULE_LICENSE("GPL v2");


module_param(max_ccb, uint, 0444);
MODULE_PARM_DESC(max_ccb, "Maximum number of HP iLO channels to attach (8)");

module_init(ilo_init);
module_init(ilo_init);
module_exit(ilo_exit);
module_exit(ilo_exit);
+3 −1
Original line number Original line Diff line number Diff line
@@ -14,7 +14,9 @@
#define ILO_NAME "hpilo"
#define ILO_NAME "hpilo"


/* max number of open channel control blocks per device, hw limited to 32 */
/* max number of open channel control blocks per device, hw limited to 32 */
#define MAX_CCB		8
#define MAX_CCB	       24
/* min number of open channel control blocks per device, hw limited to 32 */
#define MIN_CCB		8
/* max number of supported devices */
/* max number of supported devices */
#define MAX_ILO_DEV	1
#define MAX_ILO_DEV	1
/* max number of files */
/* max number of files */