You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							67 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							67 lines
						
					
					
						
							2.0 KiB
						
					
					
				| diff -Nur a/drivers/media/usb/dvb-usb/dvb-usb-firmware.c b/drivers/media/usb/dvb-usb/dvb-usb-firmware.c | |
| --- a/drivers/media/usb/dvb-usb/dvb-usb-firmware.c	2017-07-31 15:25:15.000000000 +0200 | |
| +++ b/drivers/media/usb/dvb-usb/dvb-usb-firmware.c	2019-02-23 09:05:14.000000000 +0100 | |
| @@ -35,42 +35,51 @@ | |
|   | |
|  int usb_cypress_load_firmware(struct usb_device *udev, const struct firmware *fw, int type) | |
|  { | |
| -	struct hexline hx; | |
| -	u8 reset; | |
| -	int ret,pos=0; | |
| +	struct hexline *hx; | |
| +	u8 *buf; | |
| +	int ret, pos = 0; | |
| +	u16 cpu_cs_register = cypress[type].cpu_cs_register; | |
| + | |
| +	buf = kmalloc(sizeof(*hx), GFP_KERNEL); | |
| +	if (!buf) | |
| +		return -ENOMEM; | |
| +	hx = (struct hexline *)buf; | |
|   | |
|  	/* stop the CPU */ | |
| -	reset = 1; | |
| -	if ((ret = usb_cypress_writemem(udev,cypress[type].cpu_cs_register,&reset,1)) != 1) | |
| +	buf[0] = 1; | |
| +	if (usb_cypress_writemem(udev, cpu_cs_register, buf, 1) != 1) | |
|  		err("could not stop the USB controller CPU."); | |
|   | |
| -	while ((ret = dvb_usb_get_hexline(fw,&hx,&pos)) > 0) { | |
| -		deb_fw("writing to address 0x%04x (buffer: 0x%02x %02x)\n",hx.addr,hx.len,hx.chk); | |
| -		ret = usb_cypress_writemem(udev,hx.addr,hx.data,hx.len); | |
| +	while ((ret = dvb_usb_get_hexline(fw, hx, &pos)) > 0) { | |
| +		deb_fw("writing to address 0x%04x (buffer: 0x%02x %02x)\n", hx->addr, hx->len, hx->chk); | |
| +		ret = usb_cypress_writemem(udev, hx->addr, hx->data, hx->len); | |
|   | |
| -		if (ret != hx.len) { | |
| +		if (ret != hx->len) { | |
|  			err("error while transferring firmware " | |
|  				"(transferred size: %d, block size: %d)", | |
| -				ret,hx.len); | |
| +				ret, hx->len); | |
|  			ret = -EINVAL; | |
|  			break; | |
|  		} | |
|  	} | |
|  	if (ret < 0) { | |
|  		err("firmware download failed at %d with %d",pos,ret); | |
| +		kfree(buf); | |
|  		return ret; | |
|  	} | |
|   | |
|  	if (ret == 0) { | |
|  		/* restart the CPU */ | |
| -		reset = 0; | |
| -		if (ret || usb_cypress_writemem(udev,cypress[type].cpu_cs_register,&reset,1) != 1) { | |
| +		buf[0] = 0; | |
| +		if (usb_cypress_writemem(udev, cpu_cs_register, buf, 1) != 1) { | |
|  			err("could not restart the USB controller CPU."); | |
|  			ret = -EINVAL; | |
|  		} | |
|  	} else | |
|  		ret = -EIO; | |
|   | |
| +	kfree(buf); | |
| + | |
|  	return ret; | |
|  } | |
|  EXPORT_SYMBOL(usb_cypress_load_firmware);
 | |
| 
 |