@@ -144,6 +144,48 @@ int mt76_get_of_data_from_nvmem(struct mt76_dev *dev, void *eep,
144144}
145145EXPORT_SYMBOL_GPL (mt76_get_of_data_from_nvmem );
146146
147+ static int
148+ mt76_get_eeprom_file (struct mt76_dev * dev , int len )
149+ {
150+ char path [64 ]= "" ;
151+ struct file * fp ;
152+ loff_t pos = 0 ;
153+ int ret ;
154+ struct inode * inode = NULL ;
155+ loff_t size ;
156+
157+ ret = snprintf (path ,sizeof (path ),"/lib/firmware/mediatek/%s_rf.bin" ,dev -> dev -> driver -> name );
158+ if (ret < 0 )
159+ return - EINVAL ;
160+ dev_info (dev -> dev ,"Load eeprom: %s\n" ,path );
161+ fp = filp_open (path , O_RDONLY , 0 );
162+ if (IS_ERR (fp )) {
163+ dev_info (dev -> dev ,"Open eeprom file failed: %s\n" ,path );
164+ return - ENOENT ;
165+ }
166+
167+ inode = file_inode (fp );
168+ if ((!S_ISREG (inode -> i_mode ) && !S_ISBLK (inode -> i_mode ))) {
169+ printk (KERN_ALERT "invalid file type: %s\n" , path );
170+ return - ENOENT ;
171+ }
172+ size = i_size_read (inode -> i_mapping -> host );
173+ if (size < 0 )
174+ {
175+ printk (KERN_ALERT "failed getting size of %s size:%lld \n" ,path ,size );
176+ return - ENOENT ;
177+ }
178+ ret = kernel_read (fp , dev -> eeprom .data , len , & pos );
179+ if (ret < size ){
180+ dev_info (dev -> dev ,"Load eeprom ERR, count %d byte (len:%d)\n" ,ret ,len );
181+ return - ENOENT ;
182+ }
183+ filp_close (fp , 0 );
184+ dev_info (dev -> dev ,"Load eeprom OK, count %d byte\n" ,ret );
185+
186+ return 0 ;
187+ }
188+
147189static int mt76_get_of_eeprom (struct mt76_dev * dev , void * eep , int len )
148190{
149191 struct device_node * np = dev -> dev -> of_node ;
@@ -160,6 +202,10 @@ static int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int len)
160202 if (!ret )
161203 return 0 ;
162204
205+ ret = mt76_get_eeprom_file (dev , len );
206+ if (!ret )
207+ return 0 ;
208+
163209 return mt76_get_of_data_from_nvmem (dev , eep , "eeprom" , len );
164210}
165211
0 commit comments