Char/misc driver fixes for 5.13-rc3
Here is a big set of char/misc/other driver fixes for 5.13-rc3. The majority here is the fallout of the umn.edu re-review of all prior submissions. That resulted in a bunch of reverts along with the "correct" changes made, such that there is no regression of any of the potential fixes that were made by those individuals. I would like to thank the over 80 different developers who helped with the review and fixes for this mess. Other than that, there's a few habanna driver fixes for reported issues, and some dyndbg fixes for reported problems. All of these have been in linux-next for a while with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYKZCBg8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynhRQCdGk6ri4oluyn/Z/2KAjvXDOmTmvgAn12VP42d S1Zmh4qRH2OWaLOBg7c2 =qtxj -----END PGP SIGNATURE----- Merge tag 'char-misc-5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char/misc driver fixes from Greg KH: "Here is a big set of char/misc/other driver fixes for 5.13-rc3. The majority here is the fallout of the umn.edu re-review of all prior submissions. That resulted in a bunch of reverts along with the "correct" changes made, such that there is no regression of any of the potential fixes that were made by those individuals. I would like to thank the over 80 different developers who helped with the review and fixes for this mess. Other than that, there's a few habanna driver fixes for reported issues, and some dyndbg fixes for reported problems. All of these have been in linux-next for a while with no reported problems" * tag 'char-misc-5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (82 commits) misc: eeprom: at24: check suspend status before disable regulator uio_hv_generic: Fix another memory leak in error handling paths uio_hv_generic: Fix a memory leak in error handling paths uio/uio_pci_generic: fix return value changed in refactoring Revert "Revert "ALSA: usx2y: Fix potential NULL pointer dereference"" dyndbg: drop uninformative vpr_info dyndbg: avoid calling dyndbg_emit_prefix when it has no work binder: Return EFAULT if we fail BINDER_ENABLE_ONEWAY_SPAM_DETECTION cdrom: gdrom: initialize global variable at init time brcmfmac: properly check for bus register errors Revert "brcmfmac: add a check for the status of usb_register" video: imsttfb: check for ioremap() failures Revert "video: imsttfb: fix potential NULL pointer dereferences" net: liquidio: Add missing null pointer checks Revert "net: liquidio: fix a NULL pointer dereference" media: gspca: properly check for errors in po1030_probe() Revert "media: gspca: Check the return value of write_bridge for timeout" media: gspca: mt9m111: Check write_bridge for timeout Revert "media: gspca: mt9m111: Check write_bridge for timeout" media: dvb: Add check on sp8870_readreg return ...
This commit is contained in:
		
						commit
						50f09a3dd5
					
				| @ -4918,7 +4918,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||||
| 		uint32_t enable; | ||||
| 
 | ||||
| 		if (copy_from_user(&enable, ubuf, sizeof(enable))) { | ||||
| 			ret = -EINVAL; | ||||
| 			ret = -EFAULT; | ||||
| 			goto err; | ||||
| 		} | ||||
| 		binder_inner_proc_lock(proc); | ||||
|  | ||||
| @ -744,6 +744,13 @@ static const struct blk_mq_ops gdrom_mq_ops = { | ||||
| static int probe_gdrom(struct platform_device *devptr) | ||||
| { | ||||
| 	int err; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Ensure our "one" device is initialized properly in case of previous | ||||
| 	 * usages of it | ||||
| 	 */ | ||||
| 	memset(&gd, 0, sizeof(gd)); | ||||
| 
 | ||||
| 	/* Start the device */ | ||||
| 	if (gdrom_execute_diagnostic() != 1) { | ||||
| 		pr_warn("ATA Probe for GDROM failed\n"); | ||||
| @ -830,6 +837,8 @@ static int remove_gdrom(struct platform_device *devptr) | ||||
| 	if (gdrom_major) | ||||
| 		unregister_blkdev(gdrom_major, GDROM_DEV_NAME); | ||||
| 	unregister_cdrom(gd.cd_info); | ||||
| 	kfree(gd.cd_info); | ||||
| 	kfree(gd.toc); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| @ -845,7 +854,7 @@ static struct platform_driver gdrom_driver = { | ||||
| static int __init init_gdrom(void) | ||||
| { | ||||
| 	int rc; | ||||
| 	gd.toc = NULL; | ||||
| 
 | ||||
| 	rc = platform_driver_register(&gdrom_driver); | ||||
| 	if (rc) | ||||
| 		return rc; | ||||
| @ -861,8 +870,6 @@ static void __exit exit_gdrom(void) | ||||
| { | ||||
| 	platform_device_unregister(pd); | ||||
| 	platform_driver_unregister(&gdrom_driver); | ||||
| 	kfree(gd.toc); | ||||
| 	kfree(gd.cd_info); | ||||
| } | ||||
| 
 | ||||
| module_init(init_gdrom); | ||||
|  | ||||
| @ -984,6 +984,8 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data) | ||||
| 		hdp->hd_phys_address = fixmem32->address; | ||||
| 		hdp->hd_address = ioremap(fixmem32->address, | ||||
| 						HPET_RANGE_SIZE); | ||||
| 		if (!hdp->hd_address) | ||||
| 			return AE_ERROR; | ||||
| 
 | ||||
| 		if (hpet_is_known(hdp)) { | ||||
| 			iounmap(hdp->hd_address); | ||||
|  | ||||
| @ -442,7 +442,6 @@ static int nitrox_probe(struct pci_dev *pdev, | ||||
| 	err = pci_request_mem_regions(pdev, nitrox_driver_name); | ||||
| 	if (err) { | ||||
| 		pci_disable_device(pdev); | ||||
| 		dev_err(&pdev->dev, "Failed to request mem regions!\n"); | ||||
| 		return err; | ||||
| 	} | ||||
| 	pci_set_master(pdev); | ||||
|  | ||||
| @ -418,8 +418,23 @@ static int __init hidma_mgmt_init(void) | ||||
| 		hidma_mgmt_of_populate_channels(child); | ||||
| 	} | ||||
| #endif | ||||
| 	return platform_driver_register(&hidma_mgmt_driver); | ||||
| 	/*
 | ||||
| 	 * We do not check for return value here, as it is assumed that | ||||
| 	 * platform_driver_register must not fail. The reason for this is that | ||||
| 	 * the (potential) hidma_mgmt_of_populate_channels calls above are not | ||||
| 	 * cleaned up if it does fail, and to do this work is quite | ||||
| 	 * complicated. In particular, various calls of of_address_to_resource, | ||||
| 	 * of_irq_to_resource, platform_device_register_full, of_dma_configure, | ||||
| 	 * and of_msi_configure which then call other functions and so on, must | ||||
| 	 * be cleaned up - this is not a trivial exercise. | ||||
| 	 * | ||||
| 	 * Currently, this module is not intended to be unloaded, and there is | ||||
| 	 * no module_exit function defined which does the needed cleanup. For | ||||
| 	 * this reason, we have to assume success here. | ||||
| 	 */ | ||||
| 	platform_driver_register(&hidma_mgmt_driver); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| module_init(hidma_mgmt_init); | ||||
| MODULE_LICENSE("GPL v2"); | ||||
|  | ||||
| @ -596,7 +596,6 @@ static int lm80_probe(struct i2c_client *client) | ||||
| 	struct device *dev = &client->dev; | ||||
| 	struct device *hwmon_dev; | ||||
| 	struct lm80_data *data; | ||||
| 	int rv; | ||||
| 
 | ||||
| 	data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL); | ||||
| 	if (!data) | ||||
| @ -609,14 +608,8 @@ static int lm80_probe(struct i2c_client *client) | ||||
| 	lm80_init_client(client); | ||||
| 
 | ||||
| 	/* A few vars need to be filled upon startup */ | ||||
| 	rv = lm80_read_value(client, LM80_REG_FAN_MIN(1)); | ||||
| 	if (rv < 0) | ||||
| 		return rv; | ||||
| 	data->fan[f_min][0] = rv; | ||||
| 	rv = lm80_read_value(client, LM80_REG_FAN_MIN(2)); | ||||
| 	if (rv < 0) | ||||
| 		return rv; | ||||
| 	data->fan[f_min][1] = rv; | ||||
| 	data->fan[f_min][0] = lm80_read_value(client, LM80_REG_FAN_MIN(1)); | ||||
| 	data->fan[f_min][1] = lm80_read_value(client, LM80_REG_FAN_MIN(2)); | ||||
| 
 | ||||
| 	hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, | ||||
| 							   data, lm80_groups); | ||||
|  | ||||
| @ -46,7 +46,7 @@ static void hfcsusb_start_endpoint(struct hfcsusb *hw, int channel); | ||||
| static void hfcsusb_stop_endpoint(struct hfcsusb *hw, int channel); | ||||
| static int  hfcsusb_setup_bch(struct bchannel *bch, int protocol); | ||||
| static void deactivate_bchannel(struct bchannel *bch); | ||||
| static void hfcsusb_ph_info(struct hfcsusb *hw); | ||||
| static int  hfcsusb_ph_info(struct hfcsusb *hw); | ||||
| 
 | ||||
| /* start next background transfer for control channel */ | ||||
| static void | ||||
| @ -241,7 +241,7 @@ hfcusb_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb) | ||||
|  * send full D/B channel status information | ||||
|  * as MPH_INFORMATION_IND | ||||
|  */ | ||||
| static void | ||||
| static int | ||||
| hfcsusb_ph_info(struct hfcsusb *hw) | ||||
| { | ||||
| 	struct ph_info *phi; | ||||
| @ -250,7 +250,7 @@ hfcsusb_ph_info(struct hfcsusb *hw) | ||||
| 
 | ||||
| 	phi = kzalloc(struct_size(phi, bch, dch->dev.nrbchan), GFP_ATOMIC); | ||||
| 	if (!phi) | ||||
| 		return; | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	phi->dch.ch.protocol = hw->protocol; | ||||
| 	phi->dch.ch.Flags = dch->Flags; | ||||
| @ -263,6 +263,8 @@ hfcsusb_ph_info(struct hfcsusb *hw) | ||||
| 	_queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY, | ||||
| 		    struct_size(phi, bch, dch->dev.nrbchan), phi, GFP_ATOMIC); | ||||
| 	kfree(phi); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -347,8 +349,7 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb) | ||||
| 			ret = l1_event(dch->l1, hh->prim); | ||||
| 		break; | ||||
| 	case MPH_INFORMATION_REQ: | ||||
| 		hfcsusb_ph_info(hw); | ||||
| 		ret = 0; | ||||
| 		ret = hfcsusb_ph_info(hw); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| @ -403,8 +404,7 @@ hfc_l1callback(struct dchannel *dch, u_int cmd) | ||||
| 			       hw->name, __func__, cmd); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	hfcsusb_ph_info(hw); | ||||
| 	return 0; | ||||
| 	return hfcsusb_ph_info(hw); | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| @ -746,8 +746,7 @@ hfcsusb_setup_bch(struct bchannel *bch, int protocol) | ||||
| 			handle_led(hw, (bch->nr == 1) ? LED_B1_OFF : | ||||
| 				   LED_B2_OFF); | ||||
| 	} | ||||
| 	hfcsusb_ph_info(hw); | ||||
| 	return 0; | ||||
| 	return hfcsusb_ph_info(hw); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
|  | ||||
| @ -630,17 +630,19 @@ static void | ||||
| release_io(struct inf_hw *hw) | ||||
| { | ||||
| 	if (hw->cfg.mode) { | ||||
| 		if (hw->cfg.p) { | ||||
| 		if (hw->cfg.mode == AM_MEMIO) { | ||||
| 			release_mem_region(hw->cfg.start, hw->cfg.size); | ||||
| 			iounmap(hw->cfg.p); | ||||
| 			if (hw->cfg.p) | ||||
| 				iounmap(hw->cfg.p); | ||||
| 		} else | ||||
| 			release_region(hw->cfg.start, hw->cfg.size); | ||||
| 		hw->cfg.mode = AM_NONE; | ||||
| 	} | ||||
| 	if (hw->addr.mode) { | ||||
| 		if (hw->addr.p) { | ||||
| 		if (hw->addr.mode == AM_MEMIO) { | ||||
| 			release_mem_region(hw->addr.start, hw->addr.size); | ||||
| 			iounmap(hw->addr.p); | ||||
| 			if (hw->addr.p) | ||||
| 				iounmap(hw->addr.p); | ||||
| 		} else | ||||
| 			release_region(hw->addr.start, hw->addr.size); | ||||
| 		hw->addr.mode = AM_NONE; | ||||
| @ -670,9 +672,12 @@ setup_io(struct inf_hw *hw) | ||||
| 				(ulong)hw->cfg.start, (ulong)hw->cfg.size); | ||||
| 			return err; | ||||
| 		} | ||||
| 		if (hw->ci->cfg_mode == AM_MEMIO) | ||||
| 			hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size); | ||||
| 		hw->cfg.mode = hw->ci->cfg_mode; | ||||
| 		if (hw->ci->cfg_mode == AM_MEMIO) { | ||||
| 			hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size); | ||||
| 			if (!hw->cfg.p) | ||||
| 				return -ENOMEM; | ||||
| 		} | ||||
| 		if (debug & DEBUG_HW) | ||||
| 			pr_notice("%s: IO cfg %lx (%lu bytes) mode%d\n", | ||||
| 				  hw->name, (ulong)hw->cfg.start, | ||||
| @ -697,12 +702,12 @@ setup_io(struct inf_hw *hw) | ||||
| 				(ulong)hw->addr.start, (ulong)hw->addr.size); | ||||
| 			return err; | ||||
| 		} | ||||
| 		hw->addr.mode = hw->ci->addr_mode; | ||||
| 		if (hw->ci->addr_mode == AM_MEMIO) { | ||||
| 			hw->addr.p = ioremap(hw->addr.start, hw->addr.size); | ||||
| 			if (unlikely(!hw->addr.p)) | ||||
| 			if (!hw->addr.p) | ||||
| 				return -ENOMEM; | ||||
| 		} | ||||
| 		hw->addr.mode = hw->ci->addr_mode; | ||||
| 		if (debug & DEBUG_HW) | ||||
| 			pr_notice("%s: IO addr %lx (%lu bytes) mode%d\n", | ||||
| 				  hw->name, (ulong)hw->addr.start, | ||||
|  | ||||
| @ -307,7 +307,7 @@ static int lp5523_init_program_engine(struct lp55xx_chip *chip) | ||||
| 	usleep_range(3000, 6000); | ||||
| 	ret = lp55xx_read(chip, LP5523_REG_STATUS, &status); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 		goto out; | ||||
| 	status &= LP5523_ENG_STATUS_MASK; | ||||
| 
 | ||||
| 	if (status != LP5523_ENG_STATUS_MASK) { | ||||
|  | ||||
| @ -281,7 +281,7 @@ static int sp8870_set_frontend_parameters(struct dvb_frontend *fe) | ||||
| 
 | ||||
| 	// read status reg in order to clear pending irqs
 | ||||
| 	err = sp8870_readreg(state, 0x200); | ||||
| 	if (err) | ||||
| 	if (err < 0) | ||||
| 		return err; | ||||
| 
 | ||||
| 	// system controller start
 | ||||
|  | ||||
| @ -915,7 +915,6 @@ static int rcar_drif_g_fmt_sdr_cap(struct file *file, void *priv, | ||||
| { | ||||
| 	struct rcar_drif_sdr *sdr = video_drvdata(file); | ||||
| 
 | ||||
| 	memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); | ||||
| 	f->fmt.sdr.pixelformat = sdr->fmt->pixelformat; | ||||
| 	f->fmt.sdr.buffersize = sdr->fmt->buffersize; | ||||
| 
 | ||||
|  | ||||
| @ -1424,7 +1424,6 @@ static int sd_config(struct gspca_dev *gspca_dev, | ||||
| { | ||||
| 	struct sd *sd = (struct sd *) gspca_dev; | ||||
| 	struct cam *cam; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	sd->mainsFreq = FREQ_DEF == V4L2_CID_POWER_LINE_FREQUENCY_60HZ; | ||||
| 	reset_camera_params(gspca_dev); | ||||
| @ -1436,10 +1435,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | ||||
| 	cam->cam_mode = mode; | ||||
| 	cam->nmodes = ARRAY_SIZE(mode); | ||||
| 
 | ||||
| 	ret = goto_low_power(gspca_dev); | ||||
| 	if (ret) | ||||
| 		gspca_err(gspca_dev, "Cannot go to low power mode: %d\n", | ||||
| 			  ret); | ||||
| 	goto_low_power(gspca_dev); | ||||
| 	/* Check the firmware version. */ | ||||
| 	sd->params.version.firmwareVersion = 0; | ||||
| 	get_version_information(gspca_dev); | ||||
|  | ||||
| @ -195,7 +195,7 @@ static const struct v4l2_ctrl_config mt9m111_greenbal_cfg = { | ||||
| int mt9m111_probe(struct sd *sd) | ||||
| { | ||||
| 	u8 data[2] = {0x00, 0x00}; | ||||
| 	int i, rc = 0; | ||||
| 	int i, err; | ||||
| 	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd; | ||||
| 
 | ||||
| 	if (force_sensor) { | ||||
| @ -213,18 +213,18 @@ int mt9m111_probe(struct sd *sd) | ||||
| 	/* Do the preinit */ | ||||
| 	for (i = 0; i < ARRAY_SIZE(preinit_mt9m111); i++) { | ||||
| 		if (preinit_mt9m111[i][0] == BRIDGE) { | ||||
| 			rc |= m5602_write_bridge(sd, | ||||
| 				preinit_mt9m111[i][1], | ||||
| 				preinit_mt9m111[i][2]); | ||||
| 			err = m5602_write_bridge(sd, | ||||
| 					preinit_mt9m111[i][1], | ||||
| 					preinit_mt9m111[i][2]); | ||||
| 		} else { | ||||
| 			data[0] = preinit_mt9m111[i][2]; | ||||
| 			data[1] = preinit_mt9m111[i][3]; | ||||
| 			rc |= m5602_write_sensor(sd, | ||||
| 				preinit_mt9m111[i][1], data, 2); | ||||
| 			err = m5602_write_sensor(sd, | ||||
| 					preinit_mt9m111[i][1], data, 2); | ||||
| 		} | ||||
| 		if (err < 0) | ||||
| 			return err; | ||||
| 	} | ||||
| 	if (rc < 0) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	if (m5602_read_sensor(sd, MT9M111_SC_CHIPVER, data, 2)) | ||||
| 		return -ENODEV; | ||||
|  | ||||
| @ -154,8 +154,8 @@ static const struct v4l2_ctrl_config po1030_greenbal_cfg = { | ||||
| 
 | ||||
| int po1030_probe(struct sd *sd) | ||||
| { | ||||
| 	int rc = 0; | ||||
| 	u8 dev_id_h = 0, i; | ||||
| 	int err; | ||||
| 	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd; | ||||
| 
 | ||||
| 	if (force_sensor) { | ||||
| @ -174,14 +174,14 @@ int po1030_probe(struct sd *sd) | ||||
| 	for (i = 0; i < ARRAY_SIZE(preinit_po1030); i++) { | ||||
| 		u8 data = preinit_po1030[i][2]; | ||||
| 		if (preinit_po1030[i][0] == SENSOR) | ||||
| 			rc |= m5602_write_sensor(sd, | ||||
| 				preinit_po1030[i][1], &data, 1); | ||||
| 			err = m5602_write_sensor(sd, preinit_po1030[i][1], | ||||
| 						 &data, 1); | ||||
| 		else | ||||
| 			rc |= m5602_write_bridge(sd, preinit_po1030[i][1], | ||||
| 						data); | ||||
| 			err = m5602_write_bridge(sd, preinit_po1030[i][1], | ||||
| 						 data); | ||||
| 		if (err < 0) | ||||
| 			return err; | ||||
| 	} | ||||
| 	if (rc < 0) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	if (m5602_read_sensor(sd, PO1030_DEVID_H, &dev_id_h, 1)) | ||||
| 		return -ENODEV; | ||||
|  | ||||
| @ -763,7 +763,8 @@ static int at24_probe(struct i2c_client *client) | ||||
| 	at24->nvmem = devm_nvmem_register(dev, &nvmem_config); | ||||
| 	if (IS_ERR(at24->nvmem)) { | ||||
| 		pm_runtime_disable(dev); | ||||
| 		regulator_disable(at24->vcc_reg); | ||||
| 		if (!pm_runtime_status_suspended(dev)) | ||||
| 			regulator_disable(at24->vcc_reg); | ||||
| 		return PTR_ERR(at24->nvmem); | ||||
| 	} | ||||
| 
 | ||||
| @ -774,7 +775,8 @@ static int at24_probe(struct i2c_client *client) | ||||
| 	err = at24_read(at24, 0, &test_byte, 1); | ||||
| 	if (err) { | ||||
| 		pm_runtime_disable(dev); | ||||
| 		regulator_disable(at24->vcc_reg); | ||||
| 		if (!pm_runtime_status_suspended(dev)) | ||||
| 			regulator_disable(at24->vcc_reg); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -2017,7 +2017,7 @@ wait_again: | ||||
| 		if (completion_value >= target_value) { | ||||
| 			*status = CS_WAIT_STATUS_COMPLETED; | ||||
| 		} else { | ||||
| 			timeout -= jiffies_to_usecs(completion_rc); | ||||
| 			timeout = completion_rc; | ||||
| 			goto wait_again; | ||||
| 		} | ||||
| 	} else { | ||||
|  | ||||
| @ -362,12 +362,9 @@ static int fw_read_errors(struct hl_device *hdev, u32 boot_err0_reg, | ||||
| 	} | ||||
| 
 | ||||
| 	if (err_val & CPU_BOOT_ERR0_SECURITY_NOT_RDY) { | ||||
| 		dev_warn(hdev->dev, | ||||
| 		dev_err(hdev->dev, | ||||
| 			"Device boot warning - security not ready\n"); | ||||
| 		/* This is a warning so we don't want it to disable the
 | ||||
| 		 * device | ||||
| 		 */ | ||||
| 		err_val &= ~CPU_BOOT_ERR0_SECURITY_NOT_RDY; | ||||
| 		err_exists = true; | ||||
| 	} | ||||
| 
 | ||||
| 	if (err_val & CPU_BOOT_ERR0_SECURITY_FAIL) { | ||||
| @ -403,7 +400,8 @@ static int fw_read_errors(struct hl_device *hdev, u32 boot_err0_reg, | ||||
| 		err_exists = true; | ||||
| 	} | ||||
| 
 | ||||
| 	if (err_exists) | ||||
| 	if (err_exists && ((err_val & ~CPU_BOOT_ERR0_ENABLED) & | ||||
| 				lower_32_bits(hdev->boot_error_status_mask))) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -661,18 +659,13 @@ int hl_fw_cpucp_total_energy_get(struct hl_device *hdev, u64 *total_energy) | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| int get_used_pll_index(struct hl_device *hdev, enum pll_index input_pll_index, | ||||
| int get_used_pll_index(struct hl_device *hdev, u32 input_pll_index, | ||||
| 						enum pll_index *pll_index) | ||||
| { | ||||
| 	struct asic_fixed_properties *prop = &hdev->asic_prop; | ||||
| 	u8 pll_byte, pll_bit_off; | ||||
| 	bool dynamic_pll; | ||||
| 
 | ||||
| 	if (input_pll_index >= PLL_MAX) { | ||||
| 		dev_err(hdev->dev, "PLL index %d is out of range\n", | ||||
| 							input_pll_index); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	int fw_pll_idx; | ||||
| 
 | ||||
| 	dynamic_pll = prop->fw_security_status_valid && | ||||
| 		(prop->fw_app_security_map & CPU_BOOT_DEV_STS0_DYN_PLL_EN); | ||||
| @ -680,28 +673,39 @@ int get_used_pll_index(struct hl_device *hdev, enum pll_index input_pll_index, | ||||
| 	if (!dynamic_pll) { | ||||
| 		/*
 | ||||
| 		 * in case we are working with legacy FW (each asic has unique | ||||
| 		 * PLL numbering) extract the legacy numbering | ||||
| 		 * PLL numbering) use the driver based index as they are | ||||
| 		 * aligned with fw legacy numbering | ||||
| 		 */ | ||||
| 		*pll_index = hdev->legacy_pll_map[input_pll_index]; | ||||
| 		*pll_index = input_pll_index; | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* PLL map is a u8 array */ | ||||
| 	pll_byte = prop->cpucp_info.pll_map[input_pll_index >> 3]; | ||||
| 	pll_bit_off = input_pll_index & 0x7; | ||||
| 
 | ||||
| 	if (!(pll_byte & BIT(pll_bit_off))) { | ||||
| 		dev_err(hdev->dev, "PLL index %d is not supported\n", | ||||
| 							input_pll_index); | ||||
| 	/* retrieve a FW compatible PLL index based on
 | ||||
| 	 * ASIC specific user request | ||||
| 	 */ | ||||
| 	fw_pll_idx = hdev->asic_funcs->map_pll_idx_to_fw_idx(input_pll_index); | ||||
| 	if (fw_pll_idx < 0) { | ||||
| 		dev_err(hdev->dev, "Invalid PLL index (%u) error %d\n", | ||||
| 			input_pll_index, fw_pll_idx); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	*pll_index = input_pll_index; | ||||
| 	/* PLL map is a u8 array */ | ||||
| 	pll_byte = prop->cpucp_info.pll_map[fw_pll_idx >> 3]; | ||||
| 	pll_bit_off = fw_pll_idx & 0x7; | ||||
| 
 | ||||
| 	if (!(pll_byte & BIT(pll_bit_off))) { | ||||
| 		dev_err(hdev->dev, "PLL index %d is not supported\n", | ||||
| 			fw_pll_idx); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	*pll_index = fw_pll_idx; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, enum pll_index pll_index, | ||||
| int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, u32 pll_index, | ||||
| 		u16 *pll_freq_arr) | ||||
| { | ||||
| 	struct cpucp_packet pkt; | ||||
| @ -844,8 +848,13 @@ int hl_fw_read_preboot_status(struct hl_device *hdev, u32 cpu_boot_status_reg, | ||||
| 	if (rc) { | ||||
| 		dev_err(hdev->dev, "Failed to read preboot version\n"); | ||||
| 		detect_cpu_boot_status(hdev, status); | ||||
| 		fw_read_errors(hdev, boot_err0_reg, | ||||
| 				cpu_security_boot_status_reg); | ||||
| 
 | ||||
| 		/* If we read all FF, then something is totally wrong, no point
 | ||||
| 		 * of reading specific errors | ||||
| 		 */ | ||||
| 		if (status != -1) | ||||
| 			fw_read_errors(hdev, boot_err0_reg, | ||||
| 					cpu_security_boot_status_reg); | ||||
| 		return -EIO; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -930,6 +930,9 @@ enum div_select_defs { | ||||
|  *                         driver is ready to receive asynchronous events. This | ||||
|  *                         function should be called during the first init and | ||||
|  *                         after every hard-reset of the device | ||||
|  * @get_msi_info: Retrieve asic-specific MSI ID of the f/w async event | ||||
|  * @map_pll_idx_to_fw_idx: convert driver specific per asic PLL index to | ||||
|  *                         generic f/w compatible PLL Indexes | ||||
|  */ | ||||
| struct hl_asic_funcs { | ||||
| 	int (*early_init)(struct hl_device *hdev); | ||||
| @ -1054,6 +1057,7 @@ struct hl_asic_funcs { | ||||
| 			u32 block_id, u32 block_size); | ||||
| 	void (*enable_events_from_fw)(struct hl_device *hdev); | ||||
| 	void (*get_msi_info)(u32 *table); | ||||
| 	int (*map_pll_idx_to_fw_idx)(u32 pll_idx); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| @ -1950,8 +1954,6 @@ struct hl_mmu_funcs { | ||||
|  * @aggregated_cs_counters: aggregated cs counters among all contexts | ||||
|  * @mmu_priv: device-specific MMU data. | ||||
|  * @mmu_func: device-related MMU functions. | ||||
|  * @legacy_pll_map: map holding map between dynamic (common) PLL indexes and | ||||
|  *                  static (asic specific) PLL indexes. | ||||
|  * @dram_used_mem: current DRAM memory consumption. | ||||
|  * @timeout_jiffies: device CS timeout value. | ||||
|  * @max_power: the max power of the device, as configured by the sysadmin. This | ||||
| @ -1960,6 +1962,12 @@ struct hl_mmu_funcs { | ||||
|  * @clock_gating_mask: is clock gating enabled. bitmask that represents the | ||||
|  *                     different engines. See debugfs-driver-habanalabs for | ||||
|  *                     details. | ||||
|  * @boot_error_status_mask: contains a mask of the device boot error status. | ||||
|  *                          Each bit represents a different error, according to | ||||
|  *                          the defines in hl_boot_if.h. If the bit is cleared, | ||||
|  *                          the error will be ignored by the driver during | ||||
|  *                          device initialization. Mainly used to debug and | ||||
|  *                          workaround firmware bugs | ||||
|  * @in_reset: is device in reset flow. | ||||
|  * @curr_pll_profile: current PLL profile. | ||||
|  * @card_type: Various ASICs have several card types. This indicates the card | ||||
| @ -2071,12 +2079,11 @@ struct hl_device { | ||||
| 	struct hl_mmu_priv		mmu_priv; | ||||
| 	struct hl_mmu_funcs		mmu_func[MMU_NUM_PGT_LOCATIONS]; | ||||
| 
 | ||||
| 	enum pll_index			*legacy_pll_map; | ||||
| 
 | ||||
| 	atomic64_t			dram_used_mem; | ||||
| 	u64				timeout_jiffies; | ||||
| 	u64				max_power; | ||||
| 	u64				clock_gating_mask; | ||||
| 	u64				boot_error_status_mask; | ||||
| 	atomic_t			in_reset; | ||||
| 	enum hl_pll_frequency		curr_pll_profile; | ||||
| 	enum cpucp_card_types		card_type; | ||||
| @ -2387,9 +2394,9 @@ int hl_fw_cpucp_pci_counters_get(struct hl_device *hdev, | ||||
| 		struct hl_info_pci_counters *counters); | ||||
| int hl_fw_cpucp_total_energy_get(struct hl_device *hdev, | ||||
| 			u64 *total_energy); | ||||
| int get_used_pll_index(struct hl_device *hdev, enum pll_index input_pll_index, | ||||
| int get_used_pll_index(struct hl_device *hdev, u32 input_pll_index, | ||||
| 						enum pll_index *pll_index); | ||||
| int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, enum pll_index pll_index, | ||||
| int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, u32 pll_index, | ||||
| 		u16 *pll_freq_arr); | ||||
| int hl_fw_cpucp_power_get(struct hl_device *hdev, u64 *power); | ||||
| int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg, | ||||
| @ -2411,9 +2418,9 @@ int hl_pci_set_outbound_region(struct hl_device *hdev, | ||||
| int hl_pci_init(struct hl_device *hdev); | ||||
| void hl_pci_fini(struct hl_device *hdev); | ||||
| 
 | ||||
| long hl_get_frequency(struct hl_device *hdev, enum pll_index pll_index, | ||||
| long hl_get_frequency(struct hl_device *hdev, u32 pll_index, | ||||
| 								bool curr); | ||||
| void hl_set_frequency(struct hl_device *hdev, enum pll_index pll_index, | ||||
| void hl_set_frequency(struct hl_device *hdev, u32 pll_index, | ||||
| 								u64 freq); | ||||
| int hl_get_temperature(struct hl_device *hdev, | ||||
| 		       int sensor_index, u32 attr, long *value); | ||||
|  | ||||
| @ -30,6 +30,7 @@ static DEFINE_MUTEX(hl_devs_idr_lock); | ||||
| static int timeout_locked = 30; | ||||
| static int reset_on_lockup = 1; | ||||
| static int memory_scrub = 1; | ||||
| static ulong boot_error_status_mask = ULONG_MAX; | ||||
| 
 | ||||
| module_param(timeout_locked, int, 0444); | ||||
| MODULE_PARM_DESC(timeout_locked, | ||||
| @ -43,6 +44,10 @@ module_param(memory_scrub, int, 0444); | ||||
| MODULE_PARM_DESC(memory_scrub, | ||||
| 	"Scrub device memory in various states (0 = no, 1 = yes, default yes)"); | ||||
| 
 | ||||
| module_param(boot_error_status_mask, ulong, 0444); | ||||
| MODULE_PARM_DESC(boot_error_status_mask, | ||||
| 	"Mask of the error status during device CPU boot (If bitX is cleared then error X is masked. Default all 1's)"); | ||||
| 
 | ||||
| #define PCI_VENDOR_ID_HABANALABS	0x1da3 | ||||
| 
 | ||||
| #define PCI_IDS_GOYA			0x0001 | ||||
| @ -319,6 +324,8 @@ int create_hdev(struct hl_device **dev, struct pci_dev *pdev, | ||||
| 	hdev->major = hl_major; | ||||
| 	hdev->reset_on_lockup = reset_on_lockup; | ||||
| 	hdev->memory_scrub = memory_scrub; | ||||
| 	hdev->boot_error_status_mask = boot_error_status_mask; | ||||
| 
 | ||||
| 	hdev->pldm = 0; | ||||
| 
 | ||||
| 	set_driver_behavior_per_device(hdev); | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| 
 | ||||
| #include <linux/pci.h> | ||||
| 
 | ||||
| long hl_get_frequency(struct hl_device *hdev, enum pll_index pll_index, | ||||
| long hl_get_frequency(struct hl_device *hdev, u32 pll_index, | ||||
| 								bool curr) | ||||
| { | ||||
| 	struct cpucp_packet pkt; | ||||
| @ -44,7 +44,7 @@ long hl_get_frequency(struct hl_device *hdev, enum pll_index pll_index, | ||||
| 	return (long) result; | ||||
| } | ||||
| 
 | ||||
| void hl_set_frequency(struct hl_device *hdev, enum pll_index pll_index, | ||||
| void hl_set_frequency(struct hl_device *hdev, u32 pll_index, | ||||
| 								u64 freq) | ||||
| { | ||||
| 	struct cpucp_packet pkt; | ||||
|  | ||||
| @ -105,36 +105,6 @@ | ||||
| 
 | ||||
| #define GAUDI_PLL_MAX 10 | ||||
| 
 | ||||
| /*
 | ||||
|  * this enum kept here for compatibility with old FW (in which each asic has | ||||
|  * unique PLL numbering | ||||
|  */ | ||||
| enum gaudi_pll_index { | ||||
| 	GAUDI_CPU_PLL = 0, | ||||
| 	GAUDI_PCI_PLL, | ||||
| 	GAUDI_SRAM_PLL, | ||||
| 	GAUDI_HBM_PLL, | ||||
| 	GAUDI_NIC_PLL, | ||||
| 	GAUDI_DMA_PLL, | ||||
| 	GAUDI_MESH_PLL, | ||||
| 	GAUDI_MME_PLL, | ||||
| 	GAUDI_TPC_PLL, | ||||
| 	GAUDI_IF_PLL, | ||||
| }; | ||||
| 
 | ||||
| static enum pll_index gaudi_pll_map[PLL_MAX] = { | ||||
| 	[CPU_PLL] = GAUDI_CPU_PLL, | ||||
| 	[PCI_PLL] = GAUDI_PCI_PLL, | ||||
| 	[SRAM_PLL] = GAUDI_SRAM_PLL, | ||||
| 	[HBM_PLL] = GAUDI_HBM_PLL, | ||||
| 	[NIC_PLL] = GAUDI_NIC_PLL, | ||||
| 	[DMA_PLL] = GAUDI_DMA_PLL, | ||||
| 	[MESH_PLL] = GAUDI_MESH_PLL, | ||||
| 	[MME_PLL] = GAUDI_MME_PLL, | ||||
| 	[TPC_PLL] = GAUDI_TPC_PLL, | ||||
| 	[IF_PLL] = GAUDI_IF_PLL, | ||||
| }; | ||||
| 
 | ||||
| static const char gaudi_irq_name[GAUDI_MSI_ENTRIES][GAUDI_MAX_STRING_LEN] = { | ||||
| 		"gaudi cq 0_0", "gaudi cq 0_1", "gaudi cq 0_2", "gaudi cq 0_3", | ||||
| 		"gaudi cq 1_0", "gaudi cq 1_1", "gaudi cq 1_2", "gaudi cq 1_3", | ||||
| @ -810,7 +780,7 @@ static int gaudi_fetch_psoc_frequency(struct hl_device *hdev) | ||||
| 			freq = 0; | ||||
| 		} | ||||
| 	} else { | ||||
| 		rc = hl_fw_cpucp_pll_info_get(hdev, CPU_PLL, pll_freq_arr); | ||||
| 		rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI_CPU_PLL, pll_freq_arr); | ||||
| 
 | ||||
| 		if (rc) | ||||
| 			return rc; | ||||
| @ -1652,9 +1622,6 @@ static int gaudi_sw_init(struct hl_device *hdev) | ||||
| 
 | ||||
| 	hdev->asic_specific = gaudi; | ||||
| 
 | ||||
| 	/* store legacy PLL map */ | ||||
| 	hdev->legacy_pll_map = gaudi_pll_map; | ||||
| 
 | ||||
| 	/* Create DMA pool for small allocations */ | ||||
| 	hdev->dma_pool = dma_pool_create(dev_name(hdev->dev), | ||||
| 			&hdev->pdev->dev, GAUDI_DMA_POOL_BLK_SIZE, 8, 0); | ||||
| @ -5612,6 +5579,7 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr, | ||||
| 	struct hl_cs_job *job; | ||||
| 	u32 cb_size, ctl, err_cause; | ||||
| 	struct hl_cb *cb; | ||||
| 	u64 id; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	cb = hl_cb_kernel_create(hdev, PAGE_SIZE, false); | ||||
| @ -5678,8 +5646,9 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr, | ||||
| 	} | ||||
| 
 | ||||
| release_cb: | ||||
| 	id = cb->id; | ||||
| 	hl_cb_put(cb); | ||||
| 	hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT); | ||||
| 	hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, id << PAGE_SHIFT); | ||||
| 
 | ||||
| 	return rc; | ||||
| } | ||||
| @ -8783,6 +8752,23 @@ static void gaudi_enable_events_from_fw(struct hl_device *hdev) | ||||
| 	WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR, GAUDI_EVENT_INTS_REGISTER); | ||||
| } | ||||
| 
 | ||||
| static int gaudi_map_pll_idx_to_fw_idx(u32 pll_idx) | ||||
| { | ||||
| 	switch (pll_idx) { | ||||
| 	case HL_GAUDI_CPU_PLL: return CPU_PLL; | ||||
| 	case HL_GAUDI_PCI_PLL: return PCI_PLL; | ||||
| 	case HL_GAUDI_NIC_PLL: return NIC_PLL; | ||||
| 	case HL_GAUDI_DMA_PLL: return DMA_PLL; | ||||
| 	case HL_GAUDI_MESH_PLL: return MESH_PLL; | ||||
| 	case HL_GAUDI_MME_PLL: return MME_PLL; | ||||
| 	case HL_GAUDI_TPC_PLL: return TPC_PLL; | ||||
| 	case HL_GAUDI_IF_PLL: return IF_PLL; | ||||
| 	case HL_GAUDI_SRAM_PLL: return SRAM_PLL; | ||||
| 	case HL_GAUDI_HBM_PLL: return HBM_PLL; | ||||
| 	default: return -EINVAL; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static const struct hl_asic_funcs gaudi_funcs = { | ||||
| 	.early_init = gaudi_early_init, | ||||
| 	.early_fini = gaudi_early_fini, | ||||
| @ -8866,7 +8852,8 @@ static const struct hl_asic_funcs gaudi_funcs = { | ||||
| 	.ack_protection_bits_errors = gaudi_ack_protection_bits_errors, | ||||
| 	.get_hw_block_id = gaudi_get_hw_block_id, | ||||
| 	.hw_block_mmap = gaudi_block_mmap, | ||||
| 	.enable_events_from_fw = gaudi_enable_events_from_fw | ||||
| 	.enable_events_from_fw = gaudi_enable_events_from_fw, | ||||
| 	.map_pll_idx_to_fw_idx = gaudi_map_pll_idx_to_fw_idx | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
| @ -13,7 +13,7 @@ void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq) | ||||
| 	struct gaudi_device *gaudi = hdev->asic_specific; | ||||
| 
 | ||||
| 	if (freq == PLL_LAST) | ||||
| 		hl_set_frequency(hdev, MME_PLL, gaudi->max_freq_value); | ||||
| 		hl_set_frequency(hdev, HL_GAUDI_MME_PLL, gaudi->max_freq_value); | ||||
| } | ||||
| 
 | ||||
| int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk) | ||||
| @ -23,7 +23,7 @@ int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk) | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, false); | ||||
| 	value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, false); | ||||
| 
 | ||||
| 	if (value < 0) { | ||||
| 		dev_err(hdev->dev, "Failed to retrieve device max clock %ld\n", | ||||
| @ -33,7 +33,7 @@ int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk) | ||||
| 
 | ||||
| 	*max_clk = (value / 1000 / 1000); | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, true); | ||||
| 	value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, true); | ||||
| 
 | ||||
| 	if (value < 0) { | ||||
| 		dev_err(hdev->dev, | ||||
| @ -57,7 +57,7 @@ static ssize_t clk_max_freq_mhz_show(struct device *dev, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, false); | ||||
| 	value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, false); | ||||
| 
 | ||||
| 	gaudi->max_freq_value = value; | ||||
| 
 | ||||
| @ -85,7 +85,7 @@ static ssize_t clk_max_freq_mhz_store(struct device *dev, | ||||
| 
 | ||||
| 	gaudi->max_freq_value = value * 1000 * 1000; | ||||
| 
 | ||||
| 	hl_set_frequency(hdev, MME_PLL, gaudi->max_freq_value); | ||||
| 	hl_set_frequency(hdev, HL_GAUDI_MME_PLL, gaudi->max_freq_value); | ||||
| 
 | ||||
| fail: | ||||
| 	return count; | ||||
| @ -100,7 +100,7 @@ static ssize_t clk_cur_freq_mhz_show(struct device *dev, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, true); | ||||
| 	value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, true); | ||||
| 
 | ||||
| 	return sprintf(buf, "%lu\n", (value / 1000 / 1000)); | ||||
| } | ||||
|  | ||||
| @ -118,30 +118,6 @@ | ||||
| #define IS_MME_IDLE(mme_arch_sts) \ | ||||
| 	(((mme_arch_sts) & MME_ARCH_IDLE_MASK) == MME_ARCH_IDLE_MASK) | ||||
| 
 | ||||
| /*
 | ||||
|  * this enum kept here for compatibility with old FW (in which each asic has | ||||
|  * unique PLL numbering | ||||
|  */ | ||||
| enum goya_pll_index { | ||||
| 	GOYA_CPU_PLL = 0, | ||||
| 	GOYA_IC_PLL, | ||||
| 	GOYA_MC_PLL, | ||||
| 	GOYA_MME_PLL, | ||||
| 	GOYA_PCI_PLL, | ||||
| 	GOYA_EMMC_PLL, | ||||
| 	GOYA_TPC_PLL, | ||||
| }; | ||||
| 
 | ||||
| static enum pll_index goya_pll_map[PLL_MAX] = { | ||||
| 	[CPU_PLL] = GOYA_CPU_PLL, | ||||
| 	[IC_PLL] = GOYA_IC_PLL, | ||||
| 	[MC_PLL] = GOYA_MC_PLL, | ||||
| 	[MME_PLL] = GOYA_MME_PLL, | ||||
| 	[PCI_PLL] = GOYA_PCI_PLL, | ||||
| 	[EMMC_PLL] = GOYA_EMMC_PLL, | ||||
| 	[TPC_PLL] = GOYA_TPC_PLL, | ||||
| }; | ||||
| 
 | ||||
| static const char goya_irq_name[GOYA_MSIX_ENTRIES][GOYA_MAX_STRING_LEN] = { | ||||
| 		"goya cq 0", "goya cq 1", "goya cq 2", "goya cq 3", | ||||
| 		"goya cq 4", "goya cpu eq" | ||||
| @ -775,7 +751,8 @@ static void goya_fetch_psoc_frequency(struct hl_device *hdev) | ||||
| 			freq = 0; | ||||
| 		} | ||||
| 	} else { | ||||
| 		rc = hl_fw_cpucp_pll_info_get(hdev, PCI_PLL, pll_freq_arr); | ||||
| 		rc = hl_fw_cpucp_pll_info_get(hdev, HL_GOYA_PCI_PLL, | ||||
| 				pll_freq_arr); | ||||
| 
 | ||||
| 		if (rc) | ||||
| 			return; | ||||
| @ -897,9 +874,6 @@ static int goya_sw_init(struct hl_device *hdev) | ||||
| 
 | ||||
| 	hdev->asic_specific = goya; | ||||
| 
 | ||||
| 	/* store legacy PLL map */ | ||||
| 	hdev->legacy_pll_map = goya_pll_map; | ||||
| 
 | ||||
| 	/* Create DMA pool for small allocations */ | ||||
| 	hdev->dma_pool = dma_pool_create(dev_name(hdev->dev), | ||||
| 			&hdev->pdev->dev, GOYA_DMA_POOL_BLK_SIZE, 8, 0); | ||||
| @ -5512,6 +5486,20 @@ static void goya_enable_events_from_fw(struct hl_device *hdev) | ||||
| 			GOYA_ASYNC_EVENT_ID_INTS_REGISTER); | ||||
| } | ||||
| 
 | ||||
| static int goya_map_pll_idx_to_fw_idx(u32 pll_idx) | ||||
| { | ||||
| 	switch (pll_idx) { | ||||
| 	case HL_GOYA_CPU_PLL: return CPU_PLL; | ||||
| 	case HL_GOYA_PCI_PLL: return PCI_PLL; | ||||
| 	case HL_GOYA_MME_PLL: return MME_PLL; | ||||
| 	case HL_GOYA_TPC_PLL: return TPC_PLL; | ||||
| 	case HL_GOYA_IC_PLL: return IC_PLL; | ||||
| 	case HL_GOYA_MC_PLL: return MC_PLL; | ||||
| 	case HL_GOYA_EMMC_PLL: return EMMC_PLL; | ||||
| 	default: return -EINVAL; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static const struct hl_asic_funcs goya_funcs = { | ||||
| 	.early_init = goya_early_init, | ||||
| 	.early_fini = goya_early_fini, | ||||
| @ -5595,7 +5583,8 @@ static const struct hl_asic_funcs goya_funcs = { | ||||
| 	.ack_protection_bits_errors = goya_ack_protection_bits_errors, | ||||
| 	.get_hw_block_id = goya_get_hw_block_id, | ||||
| 	.hw_block_mmap = goya_block_mmap, | ||||
| 	.enable_events_from_fw = goya_enable_events_from_fw | ||||
| 	.enable_events_from_fw = goya_enable_events_from_fw, | ||||
| 	.map_pll_idx_to_fw_idx = goya_map_pll_idx_to_fw_idx | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -13,19 +13,19 @@ void goya_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq) | ||||
| 
 | ||||
| 	switch (freq) { | ||||
| 	case PLL_HIGH: | ||||
| 		hl_set_frequency(hdev, MME_PLL, hdev->high_pll); | ||||
| 		hl_set_frequency(hdev, TPC_PLL, hdev->high_pll); | ||||
| 		hl_set_frequency(hdev, IC_PLL, hdev->high_pll); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_MME_PLL, hdev->high_pll); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_TPC_PLL, hdev->high_pll); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_IC_PLL, hdev->high_pll); | ||||
| 		break; | ||||
| 	case PLL_LOW: | ||||
| 		hl_set_frequency(hdev, MME_PLL, GOYA_PLL_FREQ_LOW); | ||||
| 		hl_set_frequency(hdev, TPC_PLL, GOYA_PLL_FREQ_LOW); | ||||
| 		hl_set_frequency(hdev, IC_PLL, GOYA_PLL_FREQ_LOW); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_MME_PLL, GOYA_PLL_FREQ_LOW); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_TPC_PLL, GOYA_PLL_FREQ_LOW); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_IC_PLL, GOYA_PLL_FREQ_LOW); | ||||
| 		break; | ||||
| 	case PLL_LAST: | ||||
| 		hl_set_frequency(hdev, MME_PLL, goya->mme_clk); | ||||
| 		hl_set_frequency(hdev, TPC_PLL, goya->tpc_clk); | ||||
| 		hl_set_frequency(hdev, IC_PLL, goya->ic_clk); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_MME_PLL, goya->mme_clk); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_TPC_PLL, goya->tpc_clk); | ||||
| 		hl_set_frequency(hdev, HL_GOYA_IC_PLL, goya->ic_clk); | ||||
| 		break; | ||||
| 	default: | ||||
| 		dev_err(hdev->dev, "unknown frequency setting\n"); | ||||
| @ -39,7 +39,7 @@ int goya_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk) | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, false); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, false); | ||||
| 
 | ||||
| 	if (value < 0) { | ||||
| 		dev_err(hdev->dev, "Failed to retrieve device max clock %ld\n", | ||||
| @ -49,7 +49,7 @@ int goya_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk) | ||||
| 
 | ||||
| 	*max_clk = (value / 1000 / 1000); | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, true); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, true); | ||||
| 
 | ||||
| 	if (value < 0) { | ||||
| 		dev_err(hdev->dev, | ||||
| @ -72,7 +72,7 @@ static ssize_t mme_clk_show(struct device *dev, struct device_attribute *attr, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, false); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, false); | ||||
| 
 | ||||
| 	if (value < 0) | ||||
| 		return value; | ||||
| @ -105,7 +105,7 @@ static ssize_t mme_clk_store(struct device *dev, struct device_attribute *attr, | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	hl_set_frequency(hdev, MME_PLL, value); | ||||
| 	hl_set_frequency(hdev, HL_GOYA_MME_PLL, value); | ||||
| 	goya->mme_clk = value; | ||||
| 
 | ||||
| fail: | ||||
| @ -121,7 +121,7 @@ static ssize_t tpc_clk_show(struct device *dev, struct device_attribute *attr, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, TPC_PLL, false); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_TPC_PLL, false); | ||||
| 
 | ||||
| 	if (value < 0) | ||||
| 		return value; | ||||
| @ -154,7 +154,7 @@ static ssize_t tpc_clk_store(struct device *dev, struct device_attribute *attr, | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	hl_set_frequency(hdev, TPC_PLL, value); | ||||
| 	hl_set_frequency(hdev, HL_GOYA_TPC_PLL, value); | ||||
| 	goya->tpc_clk = value; | ||||
| 
 | ||||
| fail: | ||||
| @ -170,7 +170,7 @@ static ssize_t ic_clk_show(struct device *dev, struct device_attribute *attr, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, IC_PLL, false); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_IC_PLL, false); | ||||
| 
 | ||||
| 	if (value < 0) | ||||
| 		return value; | ||||
| @ -203,7 +203,7 @@ static ssize_t ic_clk_store(struct device *dev, struct device_attribute *attr, | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	hl_set_frequency(hdev, IC_PLL, value); | ||||
| 	hl_set_frequency(hdev, HL_GOYA_IC_PLL, value); | ||||
| 	goya->ic_clk = value; | ||||
| 
 | ||||
| fail: | ||||
| @ -219,7 +219,7 @@ static ssize_t mme_clk_curr_show(struct device *dev, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, MME_PLL, true); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, true); | ||||
| 
 | ||||
| 	if (value < 0) | ||||
| 		return value; | ||||
| @ -236,7 +236,7 @@ static ssize_t tpc_clk_curr_show(struct device *dev, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, TPC_PLL, true); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_TPC_PLL, true); | ||||
| 
 | ||||
| 	if (value < 0) | ||||
| 		return value; | ||||
| @ -253,7 +253,7 @@ static ssize_t ic_clk_curr_show(struct device *dev, | ||||
| 	if (!hl_device_operational(hdev, NULL)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	value = hl_get_frequency(hdev, IC_PLL, true); | ||||
| 	value = hl_get_frequency(hdev, HL_GOYA_IC_PLL, true); | ||||
| 
 | ||||
| 	if (value < 0) | ||||
| 		return value; | ||||
|  | ||||
| @ -134,7 +134,7 @@ static struct ics932s401_data *ics932s401_update_device(struct device *dev) | ||||
| 	for (i = 0; i < NUM_MIRRORED_REGS; i++) { | ||||
| 		temp = i2c_smbus_read_word_data(client, regs_to_copy[i]); | ||||
| 		if (temp < 0) | ||||
| 			data->regs[regs_to_copy[i]] = 0; | ||||
| 			temp = 0; | ||||
| 		data->regs[regs_to_copy[i]] = temp >> 8; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -269,9 +269,6 @@ static netdev_tx_t caif_xmit(struct sk_buff *skb, struct net_device *dev) | ||||
| { | ||||
| 	struct ser_device *ser; | ||||
| 
 | ||||
| 	if (WARN_ON(!dev)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	ser = netdev_priv(dev); | ||||
| 
 | ||||
| 	/* Send flow off once, on high water mark */ | ||||
|  | ||||
| @ -1153,7 +1153,7 @@ static void octeon_destroy_resources(struct octeon_device *oct) | ||||
|  * @lio: per-network private data | ||||
|  * @start_stop: whether to start or stop | ||||
|  */ | ||||
| static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| static int send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| { | ||||
| 	struct octeon_soft_command *sc; | ||||
| 	union octnet_cmd *ncmd; | ||||
| @ -1161,15 +1161,15 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| 	int retval; | ||||
| 
 | ||||
| 	if (oct->props[lio->ifidx].rx_on == start_stop) | ||||
| 		return; | ||||
| 		return 0; | ||||
| 
 | ||||
| 	sc = (struct octeon_soft_command *) | ||||
| 		octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, | ||||
| 					  16, 0); | ||||
| 	if (!sc) { | ||||
| 		netif_info(lio, rx_err, lio->netdev, | ||||
| 			   "Failed to allocate octeon_soft_command\n"); | ||||
| 		return; | ||||
| 			   "Failed to allocate octeon_soft_command struct\n"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	ncmd = (union octnet_cmd *)sc->virtdptr; | ||||
| @ -1192,18 +1192,19 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| 	if (retval == IQ_SEND_FAILED) { | ||||
| 		netif_info(lio, rx_err, lio->netdev, "Failed to send RX Control message\n"); | ||||
| 		octeon_free_soft_command(oct, sc); | ||||
| 		return; | ||||
| 	} else { | ||||
| 		/* Sleep on a wait queue till the cond flag indicates that the
 | ||||
| 		 * response arrived or timed-out. | ||||
| 		 */ | ||||
| 		retval = wait_for_sc_completion_timeout(oct, sc, 0); | ||||
| 		if (retval) | ||||
| 			return; | ||||
| 			return retval; | ||||
| 
 | ||||
| 		oct->props[lio->ifidx].rx_on = start_stop; | ||||
| 		WRITE_ONCE(sc->caller_is_done, true); | ||||
| 	} | ||||
| 
 | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -1778,6 +1779,7 @@ static int liquidio_open(struct net_device *netdev) | ||||
| 	struct octeon_device_priv *oct_priv = | ||||
| 		(struct octeon_device_priv *)oct->priv; | ||||
| 	struct napi_struct *napi, *n; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	if (oct->props[lio->ifidx].napi_enabled == 0) { | ||||
| 		tasklet_disable(&oct_priv->droq_tasklet); | ||||
| @ -1813,7 +1815,9 @@ static int liquidio_open(struct net_device *netdev) | ||||
| 	netif_info(lio, ifup, lio->netdev, "Interface Open, ready for traffic\n"); | ||||
| 
 | ||||
| 	/* tell Octeon to start forwarding packets to host */ | ||||
| 	send_rx_ctrl_cmd(lio, 1); | ||||
| 	ret = send_rx_ctrl_cmd(lio, 1); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	/* start periodical statistics fetch */ | ||||
| 	INIT_DELAYED_WORK(&lio->stats_wk.work, lio_fetch_stats); | ||||
| @ -1824,7 +1828,7 @@ static int liquidio_open(struct net_device *netdev) | ||||
| 	dev_info(&oct->pci_dev->dev, "%s interface is opened\n", | ||||
| 		 netdev->name); | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -1838,6 +1842,7 @@ static int liquidio_stop(struct net_device *netdev) | ||||
| 	struct octeon_device_priv *oct_priv = | ||||
| 		(struct octeon_device_priv *)oct->priv; | ||||
| 	struct napi_struct *napi, *n; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	ifstate_reset(lio, LIO_IFSTATE_RUNNING); | ||||
| 
 | ||||
| @ -1854,7 +1859,9 @@ static int liquidio_stop(struct net_device *netdev) | ||||
| 	lio->link_changes++; | ||||
| 
 | ||||
| 	/* Tell Octeon that nic interface is down. */ | ||||
| 	send_rx_ctrl_cmd(lio, 0); | ||||
| 	ret = send_rx_ctrl_cmd(lio, 0); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	if (OCTEON_CN23XX_PF(oct)) { | ||||
| 		if (!oct->msix_on) | ||||
| @ -1889,7 +1896,7 @@ static int liquidio_stop(struct net_device *netdev) | ||||
| 
 | ||||
| 	dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name); | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
| @ -595,7 +595,7 @@ static void octeon_destroy_resources(struct octeon_device *oct) | ||||
|  * @lio: per-network private data | ||||
|  * @start_stop: whether to start or stop | ||||
|  */ | ||||
| static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| static int send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| { | ||||
| 	struct octeon_device *oct = (struct octeon_device *)lio->oct_dev; | ||||
| 	struct octeon_soft_command *sc; | ||||
| @ -603,11 +603,16 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| 	int retval; | ||||
| 
 | ||||
| 	if (oct->props[lio->ifidx].rx_on == start_stop) | ||||
| 		return; | ||||
| 		return 0; | ||||
| 
 | ||||
| 	sc = (struct octeon_soft_command *) | ||||
| 		octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, | ||||
| 					  16, 0); | ||||
| 	if (!sc) { | ||||
| 		netif_info(lio, rx_err, lio->netdev, | ||||
| 			   "Failed to allocate octeon_soft_command struct\n"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	ncmd = (union octnet_cmd *)sc->virtdptr; | ||||
| 
 | ||||
| @ -635,11 +640,13 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) | ||||
| 		 */ | ||||
| 		retval = wait_for_sc_completion_timeout(oct, sc, 0); | ||||
| 		if (retval) | ||||
| 			return; | ||||
| 			return retval; | ||||
| 
 | ||||
| 		oct->props[lio->ifidx].rx_on = start_stop; | ||||
| 		WRITE_ONCE(sc->caller_is_done, true); | ||||
| 	} | ||||
| 
 | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -906,6 +913,7 @@ static int liquidio_open(struct net_device *netdev) | ||||
| 	struct octeon_device_priv *oct_priv = | ||||
| 		(struct octeon_device_priv *)oct->priv; | ||||
| 	struct napi_struct *napi, *n; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	if (!oct->props[lio->ifidx].napi_enabled) { | ||||
| 		tasklet_disable(&oct_priv->droq_tasklet); | ||||
| @ -932,11 +940,13 @@ static int liquidio_open(struct net_device *netdev) | ||||
| 					(LIQUIDIO_NDEV_STATS_POLL_TIME_MS)); | ||||
| 
 | ||||
| 	/* tell Octeon to start forwarding packets to host */ | ||||
| 	send_rx_ctrl_cmd(lio, 1); | ||||
| 	ret = send_rx_ctrl_cmd(lio, 1); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	dev_info(&oct->pci_dev->dev, "%s interface is opened\n", netdev->name); | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -950,9 +960,12 @@ static int liquidio_stop(struct net_device *netdev) | ||||
| 	struct octeon_device_priv *oct_priv = | ||||
| 		(struct octeon_device_priv *)oct->priv; | ||||
| 	struct napi_struct *napi, *n; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	/* tell Octeon to stop forwarding packets to host */ | ||||
| 	send_rx_ctrl_cmd(lio, 0); | ||||
| 	ret = send_rx_ctrl_cmd(lio, 0); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	netif_info(lio, ifdown, lio->netdev, "Stopping interface!\n"); | ||||
| 	/* Inform that netif carrier is down */ | ||||
| @ -986,7 +999,7 @@ static int liquidio_stop(struct net_device *netdev) | ||||
| 
 | ||||
| 	dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name); | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
| @ -548,8 +548,8 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id) | ||||
| 
 | ||||
|     base = ioremap(link->resource[2]->start, resource_size(link->resource[2])); | ||||
|     if (!base) { | ||||
| 	    pcmcia_release_window(link, link->resource[2]); | ||||
| 	    return -ENOMEM; | ||||
| 	pcmcia_release_window(link, link->resource[2]); | ||||
| 	return -1; | ||||
|     } | ||||
| 
 | ||||
|     pcmcia_map_mem_page(link, link->resource[2], 0); | ||||
|  | ||||
| @ -1048,7 +1048,7 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode) | ||||
| 	for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) { | ||||
| 		skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE); | ||||
| 		if (!skb) | ||||
| 			break; | ||||
| 			goto error; | ||||
| 		qlcnic_create_loopback_buff(skb->data, adapter->mac_addr); | ||||
| 		skb_put(skb, QLCNIC_ILB_PKT_SIZE); | ||||
| 		adapter->ahw->diag_cnt = 0; | ||||
| @ -1072,6 +1072,7 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode) | ||||
| 			cnt++; | ||||
| 	} | ||||
| 	if (cnt != i) { | ||||
| error: | ||||
| 		dev_err(&adapter->pdev->dev, | ||||
| 			"LB Test: failed, TX[%d], RX[%d]\n", i, cnt); | ||||
| 		if (mode != QLCNIC_ILB_MODE) | ||||
|  | ||||
| @ -30,7 +30,7 @@ struct sunxi_priv_data { | ||||
| static int sun7i_gmac_init(struct platform_device *pdev, void *priv) | ||||
| { | ||||
| 	struct sunxi_priv_data *gmac = priv; | ||||
| 	int ret; | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	if (gmac->regulator) { | ||||
| 		ret = regulator_enable(gmac->regulator); | ||||
| @ -51,11 +51,11 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv) | ||||
| 	} else { | ||||
| 		clk_set_rate(gmac->tx_clk, SUN7I_GMAC_MII_RATE); | ||||
| 		ret = clk_prepare(gmac->tx_clk); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 		if (ret && gmac->regulator) | ||||
| 			regulator_disable(gmac->regulator); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static void sun7i_gmac_exit(struct platform_device *pdev, void *priv) | ||||
|  | ||||
| @ -8144,10 +8144,10 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end) | ||||
| 				     "VPD_SCAN: Reading in property [%s] len[%d]\n", | ||||
| 				     namebuf, prop_len); | ||||
| 			for (i = 0; i < prop_len; i++) { | ||||
| 				err = niu_pci_eeprom_read(np, off + i); | ||||
| 				if (err >= 0) | ||||
| 					*prop_buf = err; | ||||
| 				++prop_buf; | ||||
| 				err =  niu_pci_eeprom_read(np, off + i); | ||||
| 				if (err < 0) | ||||
| 					return err; | ||||
| 				*prop_buf++ = err; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| @ -8158,14 +8158,14 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end) | ||||
| } | ||||
| 
 | ||||
| /* ESPC_PIO_EN_ENABLE must be set */ | ||||
| static void niu_pci_vpd_fetch(struct niu *np, u32 start) | ||||
| static int niu_pci_vpd_fetch(struct niu *np, u32 start) | ||||
| { | ||||
| 	u32 offset; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = niu_pci_eeprom_read16_swp(np, start + 1); | ||||
| 	if (err < 0) | ||||
| 		return; | ||||
| 		return err; | ||||
| 
 | ||||
| 	offset = err + 3; | ||||
| 
 | ||||
| @ -8174,12 +8174,14 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start) | ||||
| 		u32 end; | ||||
| 
 | ||||
| 		err = niu_pci_eeprom_read(np, here); | ||||
| 		if (err < 0) | ||||
| 			return err; | ||||
| 		if (err != 0x90) | ||||
| 			return; | ||||
| 			return -EINVAL; | ||||
| 
 | ||||
| 		err = niu_pci_eeprom_read16_swp(np, here + 1); | ||||
| 		if (err < 0) | ||||
| 			return; | ||||
| 			return err; | ||||
| 
 | ||||
| 		here = start + offset + 3; | ||||
| 		end = start + offset + err; | ||||
| @ -8187,9 +8189,12 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start) | ||||
| 		offset += err; | ||||
| 
 | ||||
| 		err = niu_pci_vpd_scan_props(np, here, end); | ||||
| 		if (err < 0 || err == 1) | ||||
| 			return; | ||||
| 		if (err < 0) | ||||
| 			return err; | ||||
| 		if (err == 1) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /* ESPC_PIO_EN_ENABLE must be set */ | ||||
| @ -9280,8 +9285,11 @@ static int niu_get_invariants(struct niu *np) | ||||
| 		offset = niu_pci_vpd_offset(np); | ||||
| 		netif_printk(np, probe, KERN_DEBUG, np->dev, | ||||
| 			     "%s() VPD offset [%08x]\n", __func__, offset); | ||||
| 		if (offset) | ||||
| 			niu_pci_vpd_fetch(np, offset); | ||||
| 		if (offset) { | ||||
| 			err = niu_pci_vpd_fetch(np, offset); | ||||
| 			if (err < 0) | ||||
| 				return err; | ||||
| 		} | ||||
| 		nw64(ESPC_PIO_EN, 0); | ||||
| 
 | ||||
| 		if (np->flags & NIU_FLAGS_VPD_VALID) { | ||||
|  | ||||
| @ -1027,14 +1027,17 @@ static ssize_t ath6kl_lrssi_roam_write(struct file *file, | ||||
| { | ||||
| 	struct ath6kl *ar = file->private_data; | ||||
| 	unsigned long lrssi_roam_threshold; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (kstrtoul_from_user(user_buf, count, 0, &lrssi_roam_threshold)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	ar->lrssi_roam_threshold = lrssi_roam_threshold; | ||||
| 
 | ||||
| 	ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold); | ||||
| 	ret = ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold); | ||||
| 
 | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 	return count; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1217,13 +1217,9 @@ static struct sdio_driver brcmf_sdmmc_driver = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| void brcmf_sdio_register(void) | ||||
| int brcmf_sdio_register(void) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = sdio_register_driver(&brcmf_sdmmc_driver); | ||||
| 	if (ret) | ||||
| 		brcmf_err("sdio_register_driver failed: %d\n", ret); | ||||
| 	return sdio_register_driver(&brcmf_sdmmc_driver); | ||||
| } | ||||
| 
 | ||||
| void brcmf_sdio_exit(void) | ||||
|  | ||||
| @ -275,11 +275,26 @@ void brcmf_bus_add_txhdrlen(struct device *dev, uint len); | ||||
| 
 | ||||
| #ifdef CONFIG_BRCMFMAC_SDIO | ||||
| void brcmf_sdio_exit(void); | ||||
| void brcmf_sdio_register(void); | ||||
| int brcmf_sdio_register(void); | ||||
| #else | ||||
| static inline void brcmf_sdio_exit(void) { } | ||||
| static inline int brcmf_sdio_register(void) { return 0; } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_BRCMFMAC_USB | ||||
| void brcmf_usb_exit(void); | ||||
| void brcmf_usb_register(void); | ||||
| int brcmf_usb_register(void); | ||||
| #else | ||||
| static inline void brcmf_usb_exit(void) { } | ||||
| static inline int brcmf_usb_register(void) { return 0; } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_BRCMFMAC_PCIE | ||||
| void brcmf_pcie_exit(void); | ||||
| int brcmf_pcie_register(void); | ||||
| #else | ||||
| static inline void brcmf_pcie_exit(void) { } | ||||
| static inline int brcmf_pcie_register(void) { return 0; } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* BRCMFMAC_BUS_H */ | ||||
|  | ||||
| @ -1518,40 +1518,34 @@ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void brcmf_driver_register(struct work_struct *work) | ||||
| { | ||||
| #ifdef CONFIG_BRCMFMAC_SDIO | ||||
| 	brcmf_sdio_register(); | ||||
| #endif | ||||
| #ifdef CONFIG_BRCMFMAC_USB | ||||
| 	brcmf_usb_register(); | ||||
| #endif | ||||
| #ifdef CONFIG_BRCMFMAC_PCIE | ||||
| 	brcmf_pcie_register(); | ||||
| #endif | ||||
| } | ||||
| static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register); | ||||
| 
 | ||||
| int __init brcmf_core_init(void) | ||||
| { | ||||
| 	if (!schedule_work(&brcmf_driver_work)) | ||||
| 		return -EBUSY; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = brcmf_sdio_register(); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	err = brcmf_usb_register(); | ||||
| 	if (err) | ||||
| 		goto error_usb_register; | ||||
| 
 | ||||
| 	err = brcmf_pcie_register(); | ||||
| 	if (err) | ||||
| 		goto error_pcie_register; | ||||
| 	return 0; | ||||
| 
 | ||||
| error_pcie_register: | ||||
| 	brcmf_usb_exit(); | ||||
| error_usb_register: | ||||
| 	brcmf_sdio_exit(); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| void __exit brcmf_core_exit(void) | ||||
| { | ||||
| 	cancel_work_sync(&brcmf_driver_work); | ||||
| 
 | ||||
| #ifdef CONFIG_BRCMFMAC_SDIO | ||||
| 	brcmf_sdio_exit(); | ||||
| #endif | ||||
| #ifdef CONFIG_BRCMFMAC_USB | ||||
| 	brcmf_usb_exit(); | ||||
| #endif | ||||
| #ifdef CONFIG_BRCMFMAC_PCIE | ||||
| 	brcmf_pcie_exit(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2140,15 +2140,10 @@ static struct pci_driver brcmf_pciedrvr = { | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| void brcmf_pcie_register(void) | ||||
| int brcmf_pcie_register(void) | ||||
| { | ||||
| 	int err; | ||||
| 
 | ||||
| 	brcmf_dbg(PCIE, "Enter\n"); | ||||
| 	err = pci_register_driver(&brcmf_pciedrvr); | ||||
| 	if (err) | ||||
| 		brcmf_err(NULL, "PCIE driver registration failed, err=%d\n", | ||||
| 			  err); | ||||
| 	return pci_register_driver(&brcmf_pciedrvr); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -11,9 +11,4 @@ struct brcmf_pciedev { | ||||
| 	struct brcmf_pciedev_info *devinfo; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| void brcmf_pcie_exit(void); | ||||
| void brcmf_pcie_register(void); | ||||
| 
 | ||||
| 
 | ||||
| #endif /* BRCMFMAC_PCIE_H */ | ||||
|  | ||||
| @ -1584,12 +1584,8 @@ void brcmf_usb_exit(void) | ||||
| 	usb_deregister(&brcmf_usbdrvr); | ||||
| } | ||||
| 
 | ||||
| void brcmf_usb_register(void) | ||||
| int brcmf_usb_register(void) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	brcmf_dbg(USB, "Enter\n"); | ||||
| 	ret = usb_register(&brcmf_usbdrvr); | ||||
| 	if (ret) | ||||
| 		brcmf_err("usb_register failed %d\n", ret); | ||||
| 	return usb_register(&brcmf_usbdrvr); | ||||
| } | ||||
|  | ||||
| @ -801,24 +801,6 @@ static const struct attribute_group mesh_ie_group = { | ||||
| 	.attrs = mesh_ie_attrs, | ||||
| }; | ||||
| 
 | ||||
| static void lbs_persist_config_init(struct net_device *dev) | ||||
| { | ||||
| 	int ret; | ||||
| 	ret = sysfs_create_group(&(dev->dev.kobj), &boot_opts_group); | ||||
| 	if (ret) | ||||
| 		pr_err("failed to create boot_opts_group.\n"); | ||||
| 
 | ||||
| 	ret = sysfs_create_group(&(dev->dev.kobj), &mesh_ie_group); | ||||
| 	if (ret) | ||||
| 		pr_err("failed to create mesh_ie_group.\n"); | ||||
| } | ||||
| 
 | ||||
| static void lbs_persist_config_remove(struct net_device *dev) | ||||
| { | ||||
| 	sysfs_remove_group(&(dev->dev.kobj), &boot_opts_group); | ||||
| 	sysfs_remove_group(&(dev->dev.kobj), &mesh_ie_group); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /***************************************************************************
 | ||||
|  * Initializing and starting, stopping mesh | ||||
| @ -1014,6 +996,10 @@ static int lbs_add_mesh(struct lbs_private *priv) | ||||
| 	SET_NETDEV_DEV(priv->mesh_dev, priv->dev->dev.parent); | ||||
| 
 | ||||
| 	mesh_dev->flags |= IFF_BROADCAST | IFF_MULTICAST; | ||||
| 	mesh_dev->sysfs_groups[0] = &lbs_mesh_attr_group; | ||||
| 	mesh_dev->sysfs_groups[1] = &boot_opts_group; | ||||
| 	mesh_dev->sysfs_groups[2] = &mesh_ie_group; | ||||
| 
 | ||||
| 	/* Register virtual mesh interface */ | ||||
| 	ret = register_netdev(mesh_dev); | ||||
| 	if (ret) { | ||||
| @ -1021,19 +1007,10 @@ static int lbs_add_mesh(struct lbs_private *priv) | ||||
| 		goto err_free_netdev; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = sysfs_create_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group); | ||||
| 	if (ret) | ||||
| 		goto err_unregister; | ||||
| 
 | ||||
| 	lbs_persist_config_init(mesh_dev); | ||||
| 
 | ||||
| 	/* Everything successful */ | ||||
| 	ret = 0; | ||||
| 	goto done; | ||||
| 
 | ||||
| err_unregister: | ||||
| 	unregister_netdev(mesh_dev); | ||||
| 
 | ||||
| err_free_netdev: | ||||
| 	free_netdev(mesh_dev); | ||||
| 
 | ||||
| @ -1054,8 +1031,6 @@ void lbs_remove_mesh(struct lbs_private *priv) | ||||
| 
 | ||||
| 	netif_stop_queue(mesh_dev); | ||||
| 	netif_carrier_off(mesh_dev); | ||||
| 	sysfs_remove_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group); | ||||
| 	lbs_persist_config_remove(mesh_dev); | ||||
| 	unregister_netdev(mesh_dev); | ||||
| 	priv->mesh_dev = NULL; | ||||
| 	kfree(mesh_dev->ieee80211_ptr); | ||||
|  | ||||
| @ -440,9 +440,14 @@ static void rtl_watchdog_wq_callback(struct work_struct *work); | ||||
| static void rtl_fwevt_wq_callback(struct work_struct *work); | ||||
| static void rtl_c2hcmd_wq_callback(struct work_struct *work); | ||||
| 
 | ||||
| static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | ||||
| static int _rtl_init_deferred_work(struct ieee80211_hw *hw) | ||||
| { | ||||
| 	struct rtl_priv *rtlpriv = rtl_priv(hw); | ||||
| 	struct workqueue_struct *wq; | ||||
| 
 | ||||
| 	wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name); | ||||
| 	if (!wq) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	/* <1> timer */ | ||||
| 	timer_setup(&rtlpriv->works.watchdog_timer, | ||||
| @ -451,11 +456,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | ||||
| 		    rtl_easy_concurrent_retrytimer_callback, 0); | ||||
| 	/* <2> work queue */ | ||||
| 	rtlpriv->works.hw = hw; | ||||
| 	rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name); | ||||
| 	if (unlikely(!rtlpriv->works.rtl_wq)) { | ||||
| 		pr_err("Failed to allocate work queue\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	rtlpriv->works.rtl_wq = wq; | ||||
| 
 | ||||
| 	INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, | ||||
| 			  rtl_watchdog_wq_callback); | ||||
| @ -466,6 +467,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | ||||
| 			  rtl_swlps_rfon_wq_callback); | ||||
| 	INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq, rtl_fwevt_wq_callback); | ||||
| 	INIT_DELAYED_WORK(&rtlpriv->works.c2hcmd_wq, rtl_c2hcmd_wq_callback); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq) | ||||
| @ -564,9 +566,7 @@ int rtl_init_core(struct ieee80211_hw *hw) | ||||
| 	rtlmac->link_state = MAC80211_NOLINK; | ||||
| 
 | ||||
| 	/* <6> init deferred work */ | ||||
| 	_rtl_init_deferred_work(hw); | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return _rtl_init_deferred_work(hw); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(rtl_init_core); | ||||
| 
 | ||||
|  | ||||
| @ -2127,6 +2127,14 @@ static int riocm_add_mport(struct device *dev, | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	cm->rx_wq = create_workqueue(DRV_NAME "/rxq"); | ||||
| 	if (!cm->rx_wq) { | ||||
| 		rio_release_inb_mbox(mport, cmbox); | ||||
| 		rio_release_outb_mbox(mport, cmbox); | ||||
| 		kfree(cm); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Allocate and register inbound messaging buffers to be ready | ||||
| 	 * to receive channel and system management requests | ||||
| @ -2137,15 +2145,6 @@ static int riocm_add_mport(struct device *dev, | ||||
| 	cm->rx_slots = RIOCM_RX_RING_SIZE; | ||||
| 	mutex_init(&cm->rx_lock); | ||||
| 	riocm_rx_fill(cm, RIOCM_RX_RING_SIZE); | ||||
| 	cm->rx_wq = create_workqueue(DRV_NAME "/rxq"); | ||||
| 	if (!cm->rx_wq) { | ||||
| 		riocm_error("failed to allocate IBMBOX_%d on %s", | ||||
| 			    cmbox, mport->name); | ||||
| 		rio_release_outb_mbox(mport, cmbox); | ||||
| 		kfree(cm); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	INIT_WORK(&cm->rx_work, rio_ibmsg_handler); | ||||
| 
 | ||||
| 	cm->tx_slot = 0; | ||||
|  | ||||
| @ -467,21 +467,24 @@ static int ufs_hisi_init_common(struct ufs_hba *hba) | ||||
| 	host->hba = hba; | ||||
| 	ufshcd_set_variant(hba, host); | ||||
| 
 | ||||
| 	host->rst  = devm_reset_control_get(dev, "rst"); | ||||
| 	host->rst = devm_reset_control_get(dev, "rst"); | ||||
| 	if (IS_ERR(host->rst)) { | ||||
| 		dev_err(dev, "%s: failed to get reset control\n", __func__); | ||||
| 		return PTR_ERR(host->rst); | ||||
| 		err = PTR_ERR(host->rst); | ||||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	ufs_hisi_set_pm_lvl(hba); | ||||
| 
 | ||||
| 	err = ufs_hisi_get_resource(host); | ||||
| 	if (err) { | ||||
| 		ufshcd_set_variant(hba, NULL); | ||||
| 		return err; | ||||
| 	} | ||||
| 	if (err) | ||||
| 		goto error; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| error: | ||||
| 	ufshcd_set_variant(hba, NULL); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static int ufs_hi3660_init(struct ufs_hba *hba) | ||||
|  | ||||
| @ -1519,6 +1519,8 @@ static int __init max310x_uart_init(void) | ||||
| 
 | ||||
| #ifdef CONFIG_SPI_MASTER | ||||
| 	ret = spi_register_driver(&max310x_spi_driver); | ||||
| 	if (ret) | ||||
| 		uart_unregister_driver(&max310x_uart); | ||||
| #endif | ||||
| 
 | ||||
| 	return ret; | ||||
|  | ||||
| @ -818,9 +818,6 @@ static int mvebu_uart_probe(struct platform_device *pdev) | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!match) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* Assume that all UART ports have a DT alias or none has */ | ||||
| 	id = of_alias_get_id(pdev->dev.of_node, "serial"); | ||||
| 	if (!pdev->dev.of_node || id < 0) | ||||
|  | ||||
| @ -291,13 +291,15 @@ hv_uio_probe(struct hv_device *dev, | ||||
| 	pdata->recv_buf = vzalloc(RECV_BUFFER_SIZE); | ||||
| 	if (pdata->recv_buf == NULL) { | ||||
| 		ret = -ENOMEM; | ||||
| 		goto fail_close; | ||||
| 		goto fail_free_ring; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = vmbus_establish_gpadl(channel, pdata->recv_buf, | ||||
| 				    RECV_BUFFER_SIZE, &pdata->recv_gpadl); | ||||
| 	if (ret) | ||||
| 	if (ret) { | ||||
| 		vfree(pdata->recv_buf); | ||||
| 		goto fail_close; | ||||
| 	} | ||||
| 
 | ||||
| 	/* put Global Physical Address Label in name */ | ||||
| 	snprintf(pdata->recv_name, sizeof(pdata->recv_name), | ||||
| @ -316,8 +318,10 @@ hv_uio_probe(struct hv_device *dev, | ||||
| 
 | ||||
| 	ret = vmbus_establish_gpadl(channel, pdata->send_buf, | ||||
| 				    SEND_BUFFER_SIZE, &pdata->send_gpadl); | ||||
| 	if (ret) | ||||
| 	if (ret) { | ||||
| 		vfree(pdata->send_buf); | ||||
| 		goto fail_close; | ||||
| 	} | ||||
| 
 | ||||
| 	snprintf(pdata->send_name, sizeof(pdata->send_name), | ||||
| 		 "send:%u", pdata->send_gpadl); | ||||
| @ -347,6 +351,8 @@ hv_uio_probe(struct hv_device *dev, | ||||
| 
 | ||||
| fail_close: | ||||
| 	hv_uio_cleanup(dev, pdata); | ||||
| fail_free_ring: | ||||
| 	vmbus_free_ring(dev->channel); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| @ -82,7 +82,7 @@ static int probe(struct pci_dev *pdev, | ||||
| 	} | ||||
| 
 | ||||
| 	if (pdev->irq && !pci_intx_mask_supported(pdev)) | ||||
| 		return -ENOMEM; | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	gdev = devm_kzalloc(&pdev->dev, sizeof(struct uio_pci_generic_dev), GFP_KERNEL); | ||||
| 	if (!gdev) | ||||
|  | ||||
| @ -286,7 +286,7 @@ static int hga_card_detect(void) | ||||
| 
 | ||||
| 	hga_vram = ioremap(0xb0000, hga_vram_len); | ||||
| 	if (!hga_vram) | ||||
| 		goto error; | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	if (request_region(0x3b0, 12, "hgafb")) | ||||
| 		release_io_ports = 1; | ||||
| @ -346,13 +346,18 @@ static int hga_card_detect(void) | ||||
| 			hga_type_name = "Hercules"; | ||||
| 			break; | ||||
| 	} | ||||
| 	return 1; | ||||
| 	return 0; | ||||
| error: | ||||
| 	if (release_io_ports) | ||||
| 		release_region(0x3b0, 12); | ||||
| 	if (release_io_port) | ||||
| 		release_region(0x3bf, 1); | ||||
| 	return 0; | ||||
| 
 | ||||
| 	iounmap(hga_vram); | ||||
| 
 | ||||
| 	pr_err("hgafb: HGA card not detected.\n"); | ||||
| 
 | ||||
| 	return -EINVAL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -550,13 +555,11 @@ static const struct fb_ops hgafb_ops = { | ||||
| static int hgafb_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct fb_info *info; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (! hga_card_detect()) { | ||||
| 		printk(KERN_INFO "hgafb: HGA card not detected.\n"); | ||||
| 		if (hga_vram) | ||||
| 			iounmap(hga_vram); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	ret = hga_card_detect(); | ||||
| 	if (!ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n", | ||||
| 		hga_type_name, hga_vram_len/1024); | ||||
|  | ||||
| @ -1469,6 +1469,7 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||||
| 	struct imstt_par *par; | ||||
| 	struct fb_info *info; | ||||
| 	struct device_node *dp; | ||||
| 	int ret = -ENOMEM; | ||||
| 	 | ||||
| 	dp = pci_device_to_OF_node(pdev); | ||||
| 	if(dp) | ||||
| @ -1504,28 +1505,37 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||||
| 		default: | ||||
| 			printk(KERN_INFO "imsttfb: Device 0x%x unknown, " | ||||
| 					 "contact maintainer.\n", pdev->device); | ||||
| 			release_mem_region(addr, size); | ||||
| 			framebuffer_release(info); | ||||
| 			return -ENODEV; | ||||
| 			ret = -ENODEV; | ||||
| 			goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	info->fix.smem_start = addr; | ||||
| 	info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ? | ||||
| 					    0x400000 : 0x800000); | ||||
| 	if (!info->screen_base) { | ||||
| 		release_mem_region(addr, size); | ||||
| 		framebuffer_release(info); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 	if (!info->screen_base) | ||||
| 		goto error; | ||||
| 	info->fix.mmio_start = addr + 0x800000; | ||||
| 	par->dc_regs = ioremap(addr + 0x800000, 0x1000); | ||||
| 	if (!par->dc_regs) | ||||
| 		goto error; | ||||
| 	par->cmap_regs_phys = addr + 0x840000; | ||||
| 	par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000); | ||||
| 	if (!par->cmap_regs) | ||||
| 		goto error; | ||||
| 	info->pseudo_palette = par->palette; | ||||
| 	init_imstt(info); | ||||
| 
 | ||||
| 	pci_set_drvdata(pdev, info); | ||||
| 	return 0; | ||||
| 
 | ||||
| error: | ||||
| 	if (par->dc_regs) | ||||
| 		iounmap(par->dc_regs); | ||||
| 	if (info->screen_base) | ||||
| 		iounmap(info->screen_base); | ||||
| 	release_mem_region(addr, size); | ||||
| 	framebuffer_release(info); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static void imsttfb_remove(struct pci_dev *pdev) | ||||
|  | ||||
| @ -296,10 +296,6 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, | ||||
| 	struct extent_crypt_result ecr; | ||||
| 	int rc = 0; | ||||
| 
 | ||||
| 	if (!crypt_stat || !crypt_stat->tfm | ||||
| 	       || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (unlikely(ecryptfs_verbosity > 0)) { | ||||
| 		ecryptfs_printk(KERN_DEBUG, "Key size [%zd]; key:\n", | ||||
| 				crypt_stat->key_size); | ||||
|  | ||||
| @ -32,6 +32,11 @@ struct _ddebug { | ||||
| #define _DPRINTK_FLAGS_INCL_FUNCNAME	(1<<2) | ||||
| #define _DPRINTK_FLAGS_INCL_LINENO	(1<<3) | ||||
| #define _DPRINTK_FLAGS_INCL_TID		(1<<4) | ||||
| 
 | ||||
| #define _DPRINTK_FLAGS_INCL_ANY		\ | ||||
| 	(_DPRINTK_FLAGS_INCL_MODNAME | _DPRINTK_FLAGS_INCL_FUNCNAME |\ | ||||
| 	 _DPRINTK_FLAGS_INCL_LINENO  | _DPRINTK_FLAGS_INCL_TID) | ||||
| 
 | ||||
| #if defined DEBUG | ||||
| #define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT | ||||
| #else | ||||
|  | ||||
| @ -239,6 +239,39 @@ enum gaudi_engine_id { | ||||
| 	GAUDI_ENGINE_ID_SIZE | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * ASIC specific PLL index | ||||
|  * | ||||
|  * Used to retrieve in frequency info of different IPs via | ||||
|  * HL_INFO_PLL_FREQUENCY under HL_IOCTL_INFO IOCTL. The enums need to be | ||||
|  * used as an index in struct hl_pll_frequency_info | ||||
|  */ | ||||
| 
 | ||||
| enum hl_goya_pll_index { | ||||
| 	HL_GOYA_CPU_PLL = 0, | ||||
| 	HL_GOYA_IC_PLL, | ||||
| 	HL_GOYA_MC_PLL, | ||||
| 	HL_GOYA_MME_PLL, | ||||
| 	HL_GOYA_PCI_PLL, | ||||
| 	HL_GOYA_EMMC_PLL, | ||||
| 	HL_GOYA_TPC_PLL, | ||||
| 	HL_GOYA_PLL_MAX | ||||
| }; | ||||
| 
 | ||||
| enum hl_gaudi_pll_index { | ||||
| 	HL_GAUDI_CPU_PLL = 0, | ||||
| 	HL_GAUDI_PCI_PLL, | ||||
| 	HL_GAUDI_SRAM_PLL, | ||||
| 	HL_GAUDI_HBM_PLL, | ||||
| 	HL_GAUDI_NIC_PLL, | ||||
| 	HL_GAUDI_DMA_PLL, | ||||
| 	HL_GAUDI_MESH_PLL, | ||||
| 	HL_GAUDI_MME_PLL, | ||||
| 	HL_GAUDI_TPC_PLL, | ||||
| 	HL_GAUDI_IF_PLL, | ||||
| 	HL_GAUDI_PLL_MAX | ||||
| }; | ||||
| 
 | ||||
| enum hl_device_status { | ||||
| 	HL_DEVICE_STATUS_OPERATIONAL, | ||||
| 	HL_DEVICE_STATUS_IN_RESET, | ||||
|  | ||||
| @ -586,13 +586,11 @@ static int remaining(int wrote) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf) | ||||
| static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf) | ||||
| { | ||||
| 	int pos_after_tid; | ||||
| 	int pos = 0; | ||||
| 
 | ||||
| 	*buf = '\0'; | ||||
| 
 | ||||
| 	if (desc->flags & _DPRINTK_FLAGS_INCL_TID) { | ||||
| 		if (in_interrupt()) | ||||
| 			pos += snprintf(buf + pos, remaining(pos), "<intr> "); | ||||
| @ -618,11 +616,18 @@ static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf) | ||||
| 	return buf; | ||||
| } | ||||
| 
 | ||||
| static inline char *dynamic_emit_prefix(struct _ddebug *desc, char *buf) | ||||
| { | ||||
| 	if (unlikely(desc->flags & _DPRINTK_FLAGS_INCL_ANY)) | ||||
| 		return __dynamic_emit_prefix(desc, buf); | ||||
| 	return buf; | ||||
| } | ||||
| 
 | ||||
| void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) | ||||
| { | ||||
| 	va_list args; | ||||
| 	struct va_format vaf; | ||||
| 	char buf[PREFIX_SIZE]; | ||||
| 	char buf[PREFIX_SIZE] = ""; | ||||
| 
 | ||||
| 	BUG_ON(!descriptor); | ||||
| 	BUG_ON(!fmt); | ||||
| @ -655,7 +660,7 @@ void __dynamic_dev_dbg(struct _ddebug *descriptor, | ||||
| 	if (!dev) { | ||||
| 		printk(KERN_DEBUG "(NULL device *): %pV", &vaf); | ||||
| 	} else { | ||||
| 		char buf[PREFIX_SIZE]; | ||||
| 		char buf[PREFIX_SIZE] = ""; | ||||
| 
 | ||||
| 		dev_printk_emit(LOGLEVEL_DEBUG, dev, "%s%s %s: %pV", | ||||
| 				dynamic_emit_prefix(descriptor, buf), | ||||
| @ -684,7 +689,7 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor, | ||||
| 	vaf.va = &args; | ||||
| 
 | ||||
| 	if (dev && dev->dev.parent) { | ||||
| 		char buf[PREFIX_SIZE]; | ||||
| 		char buf[PREFIX_SIZE] = ""; | ||||
| 
 | ||||
| 		dev_printk_emit(LOGLEVEL_DEBUG, dev->dev.parent, | ||||
| 				"%s%s %s %s%s: %pV", | ||||
| @ -720,7 +725,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor, | ||||
| 	vaf.va = &args; | ||||
| 
 | ||||
| 	if (ibdev && ibdev->dev.parent) { | ||||
| 		char buf[PREFIX_SIZE]; | ||||
| 		char buf[PREFIX_SIZE] = ""; | ||||
| 
 | ||||
| 		dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent, | ||||
| 				"%s%s %s %s: %pV", | ||||
| @ -915,7 +920,6 @@ static const struct seq_operations ddebug_proc_seqops = { | ||||
| 
 | ||||
| static int ddebug_proc_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	vpr_info("called\n"); | ||||
| 	return seq_open_private(file, &ddebug_proc_seqops, | ||||
| 				sizeof(struct ddebug_iter)); | ||||
| } | ||||
|  | ||||
| @ -402,6 +402,14 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name, | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	smcd->event_wq = alloc_ordered_workqueue("ism_evt_wq-%s)", | ||||
| 						 WQ_MEM_RECLAIM, name); | ||||
| 	if (!smcd->event_wq) { | ||||
| 		kfree(smcd->conn); | ||||
| 		kfree(smcd); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	smcd->dev.parent = parent; | ||||
| 	smcd->dev.release = smcd_release; | ||||
| 	device_initialize(&smcd->dev); | ||||
| @ -415,13 +423,6 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name, | ||||
| 	INIT_LIST_HEAD(&smcd->vlan); | ||||
| 	INIT_LIST_HEAD(&smcd->lgr_list); | ||||
| 	init_waitqueue_head(&smcd->lgrs_deleted); | ||||
| 	smcd->event_wq = alloc_ordered_workqueue("ism_evt_wq-%s)", | ||||
| 						 WQ_MEM_RECLAIM, name); | ||||
| 	if (!smcd->event_wq) { | ||||
| 		kfree(smcd->conn); | ||||
| 		kfree(smcd); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	return smcd; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(smcd_alloc_dev); | ||||
|  | ||||
| @ -77,17 +77,8 @@ static const struct snd_kcontrol_new snd_gus_joystick_control = { | ||||
| 
 | ||||
| static void snd_gus_init_control(struct snd_gus_card *gus) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (!gus->ace_flag) { | ||||
| 		ret = | ||||
| 			snd_ctl_add(gus->card, | ||||
| 					snd_ctl_new1(&snd_gus_joystick_control, | ||||
| 						gus)); | ||||
| 		if (ret) | ||||
| 			snd_printk(KERN_ERR "gus: snd_ctl_add failed: %d\n", | ||||
| 					ret); | ||||
| 	} | ||||
| 	if (!gus->ace_flag) | ||||
| 		snd_ctl_add(gus->card, snd_ctl_new1(&snd_gus_joystick_control, gus)); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -846,14 +846,10 @@ int snd_sb16dsp_pcm(struct snd_sb *chip, int device) | ||||
| 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_sb16_playback_ops); | ||||
| 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_sb16_capture_ops); | ||||
| 
 | ||||
| 	if (chip->dma16 >= 0 && chip->dma8 != chip->dma16) { | ||||
| 		err = snd_ctl_add(card, snd_ctl_new1( | ||||
| 					&snd_sb16_dma_control, chip)); | ||||
| 		if (err) | ||||
| 			return err; | ||||
| 	} else { | ||||
| 	if (chip->dma16 >= 0 && chip->dma8 != chip->dma16) | ||||
| 		snd_ctl_add(card, snd_ctl_new1(&snd_sb16_dma_control, chip)); | ||||
| 	else | ||||
| 		pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX; | ||||
| 	} | ||||
| 
 | ||||
| 	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, | ||||
| 				       card->dev, 64*1024, 128*1024); | ||||
|  | ||||
| @ -93,12 +93,12 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) | ||||
| 	acard = card->private_data; | ||||
| 	card->private_free = snd_sb8_free; | ||||
| 
 | ||||
| 	/* block the 0x388 port to avoid PnP conflicts */ | ||||
| 	/*
 | ||||
| 	 * Block the 0x388 port to avoid PnP conflicts. | ||||
| 	 * No need to check this value after request_region, | ||||
| 	 * as we never do anything with it. | ||||
| 	 */ | ||||
| 	acard->fm_res = request_region(0x388, 4, "SoundBlaster FM"); | ||||
| 	if (!acard->fm_res) { | ||||
| 		err = -EBUSY; | ||||
| 		goto _err; | ||||
| 	} | ||||
| 
 | ||||
| 	if (port[dev] != SNDRV_AUTO_PORT) { | ||||
| 		if ((err = snd_sbdsp_create(card, port[dev], irq[dev], | ||||
|  | ||||
| @ -1735,6 +1735,14 @@ static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL); | ||||
| static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL); | ||||
| static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL); | ||||
| 
 | ||||
| static struct attribute *hpload_attrs[] = { | ||||
| 	&dev_attr_hpload_dc_l.attr, | ||||
| 	&dev_attr_hpload_dc_r.attr, | ||||
| 	&dev_attr_hpload_ac_l.attr, | ||||
| 	&dev_attr_hpload_ac_r.attr, | ||||
| }; | ||||
| ATTRIBUTE_GROUPS(hpload); | ||||
| 
 | ||||
| static struct reg_sequence hp_en_cal_seq[] = { | ||||
| 	{CS43130_INT_MASK_4, CS43130_INT_MASK_ALL}, | ||||
| 	{CS43130_HP_MEAS_LOAD_1, 0}, | ||||
| @ -2302,25 +2310,15 @@ static int cs43130_probe(struct snd_soc_component *component) | ||||
| 
 | ||||
| 	cs43130->hpload_done = false; | ||||
| 	if (cs43130->dc_meas) { | ||||
| 		ret = device_create_file(component->dev, &dev_attr_hpload_dc_l); | ||||
| 		if (ret < 0) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		ret = device_create_file(component->dev, &dev_attr_hpload_dc_r); | ||||
| 		if (ret < 0) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		ret = device_create_file(component->dev, &dev_attr_hpload_ac_l); | ||||
| 		if (ret < 0) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		ret = device_create_file(component->dev, &dev_attr_hpload_ac_r); | ||||
| 		if (ret < 0) | ||||
| 		ret = sysfs_create_groups(&component->dev->kobj, hpload_groups); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		cs43130->wq = create_singlethread_workqueue("cs43130_hp"); | ||||
| 		if (!cs43130->wq) | ||||
| 		if (!cs43130->wq) { | ||||
| 			sysfs_remove_groups(&component->dev->kobj, hpload_groups); | ||||
| 			return -ENOMEM; | ||||
| 		} | ||||
| 		INIT_WORK(&cs43130->work, cs43130_imp_meas); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -3388,30 +3388,44 @@ static int rt5645_probe(struct snd_soc_component *component) | ||||
| { | ||||
| 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); | ||||
| 	struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); | ||||
| 	int ret = 0; | ||||
| 
 | ||||
| 	rt5645->component = component; | ||||
| 
 | ||||
| 	switch (rt5645->codec_type) { | ||||
| 	case CODEC_TYPE_RT5645: | ||||
| 		snd_soc_dapm_new_controls(dapm, | ||||
| 		ret = snd_soc_dapm_new_controls(dapm, | ||||
| 			rt5645_specific_dapm_widgets, | ||||
| 			ARRAY_SIZE(rt5645_specific_dapm_widgets)); | ||||
| 		snd_soc_dapm_add_routes(dapm, | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 
 | ||||
| 		ret = snd_soc_dapm_add_routes(dapm, | ||||
| 			rt5645_specific_dapm_routes, | ||||
| 			ARRAY_SIZE(rt5645_specific_dapm_routes)); | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 
 | ||||
| 		if (rt5645->v_id < 3) { | ||||
| 			snd_soc_dapm_add_routes(dapm, | ||||
| 			ret = snd_soc_dapm_add_routes(dapm, | ||||
| 				rt5645_old_dapm_routes, | ||||
| 				ARRAY_SIZE(rt5645_old_dapm_routes)); | ||||
| 			if (ret < 0) | ||||
| 				goto exit; | ||||
| 		} | ||||
| 		break; | ||||
| 	case CODEC_TYPE_RT5650: | ||||
| 		snd_soc_dapm_new_controls(dapm, | ||||
| 		ret = snd_soc_dapm_new_controls(dapm, | ||||
| 			rt5650_specific_dapm_widgets, | ||||
| 			ARRAY_SIZE(rt5650_specific_dapm_widgets)); | ||||
| 		snd_soc_dapm_add_routes(dapm, | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 
 | ||||
| 		ret = snd_soc_dapm_add_routes(dapm, | ||||
| 			rt5650_specific_dapm_routes, | ||||
| 			ARRAY_SIZE(rt5650_specific_dapm_routes)); | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| @ -3419,9 +3433,17 @@ static int rt5645_probe(struct snd_soc_component *component) | ||||
| 
 | ||||
| 	/* for JD function */ | ||||
| 	if (rt5645->pdata.jd_mode) { | ||||
| 		snd_soc_dapm_force_enable_pin(dapm, "JD Power"); | ||||
| 		snd_soc_dapm_force_enable_pin(dapm, "LDO2"); | ||||
| 		snd_soc_dapm_sync(dapm); | ||||
| 		ret = snd_soc_dapm_force_enable_pin(dapm, "JD Power"); | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 
 | ||||
| 		ret = snd_soc_dapm_force_enable_pin(dapm, "LDO2"); | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 
 | ||||
| 		ret = snd_soc_dapm_sync(dapm); | ||||
| 		if (ret < 0) | ||||
| 			goto exit; | ||||
| 	} | ||||
| 
 | ||||
| 	if (rt5645->pdata.long_name) | ||||
| @ -3432,9 +3454,14 @@ static int rt5645_probe(struct snd_soc_component *component) | ||||
| 		GFP_KERNEL); | ||||
| 
 | ||||
| 	if (!rt5645->eq_param) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	return 0; | ||||
| 		ret = -ENOMEM; | ||||
| exit: | ||||
| 	/*
 | ||||
| 	 * If there was an error above, everything will be cleaned up by the | ||||
| 	 * caller if we return an error here.  This will be done with a later | ||||
| 	 * call to rt5645_remove(). | ||||
| 	 */ | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static void rt5645_remove(struct snd_soc_component *component) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user